我正在尝试使用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。
答案 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