更新EF 4功能CTP 4分离的POCO

时间:2010-08-06 16:22:11

标签: .net entity-framework-4 poco

我正在尝试使用EF 4 CTP 4更新分离的POCO。

我的域类看起来像这样:

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 个答案:

答案 0 :(得分:6)

我明白了......

在dbContext类中,我添加了一个将实体标记为已修改的方法。

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

我的存储库方法现在看起来像这样

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

  dbContext.SaveChanges();
}

答案 1 :(得分:2)

我知道这基本上是做同样的事情,但我在用户资源库中所做的工作有一个名为GetForUpdate的方法或类似的东西:

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

然后,当您想要“更新”具有已知ID的用户时:

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

附加用户并然后修改属性会自动将EntityState设置为Modified

HTH