Обновление EF 4 Feature CTP 4 Detached POCO - PullRequest
5 голосов
/ 06 августа 2010

Я пытаюсь обновить отдельный POCO с EF 4 CTP 4.

Мой класс домена выглядит так:

public class User {
  public int Id { get; set; }

  [Required, DisplayName("First Name")]
  public string FirstName { get; set; }

  [Required, DisplayName("Last Name")]
  public string LastName { get; set; }

  [ConcurrencyCheckAttribute, Timestamp]
  public byte[] DataVersion { get; set; }
}

В хранилище у меня есть следующее:

public void SaveUser(User user) {
  if (user.Id > 0) {
   dbContext.Users.Attach(user);
  }
  else {
   dbContext.Users.Add(user);
  }
  dbContext.SaveChanges();
}

dbContext наследуется от DbContext.

Я могу делать вставки нормально, но присоединение не работает. Я запускаю Sql Profiler, и sql для обновления не отправляется.

Ответы [ 2 ]

6 голосов
/ 06 августа 2010

Я понял это ....

В классе dbContext я добавил метод, который помечает сущность как измененную.

public void MarkAsModified(object entity) {
  base.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}

Мой метод хранилища теперь выглядит так1006 *

public void SaveUser(User user) {
  if (user.Id > 0) {
    dbContext.Users.Attach(user);
    dbContext.MarkAsModified(user);
  }
  else {
    dbContext.Users.Add(user);
  }

  dbContext.SaveChanges();
}
2 голосов
/ 09 августа 2010

Я знаю, что это в основном то же самое, но в вашем хранилище пользователей есть метод с именем GetForUpdate или что-то подобное:

public User GetForUpdate(int id)
{
    var u = new User();
    u.Id = id;
    dbContext.Users.Attach(u);
    return u;
}

Тогда, когда вы хотите «обновить» пользователя с известным идентификатором:

var user = userRepo.GetForUpdate(id);
user.Name = "John Doe";
user.Username = "john.doe";
userRepo.SaveUser(user);

Присоединение пользователя и , а затем изменяющие свойства автоматически установят EntityState как Modified.

НТН

...