我们有一个WCF服务,其中包含更新数据库中客户的更新方法。 此方法从客户端获取分离的实体。
void UpdtaeCustomer(Customer detachedCustomer);
我们提出了两种编写此方法的方法:
1)
context.CustomerSet.Attach(detachedCustomer);
context.ObjectStateManager.ChangeObjectState(detachedCustomer, entityState.Modified);
context.SaveChanges();
2)
Customer customer = context.GetObjectByKey(detachedCustomer.EntityKey);
context.ApplyCurrentValues<Customer>("CustomerSet", detachedCustomer);
context.SaveChanges();
我们想考虑每种方法的缺点\专业。第一个明显的优势是只有一次DB。但第二种方法的优点是什么呢? (或者他们的行为可能不一样)?
答案 0 :(得分:7)
使用第一种方法。使用具有分离实体的第二种方法没有一般优势,相反它可能使事情变得更糟。
假设您使用时间戳。时间戳是表示行版本的特殊DB类型。每次数据库中的记录更改时,时间戳都会自动增加。时间戳用于concurrecny检查,当与EF一起使用时,它被处理为Computed
列。每次EF想要更新记录时,它都会将数据库中的时间戳与您加载对象时检索到的时间戳进行比较(必须在您的实体中传输到客户端并返回)。如果时间戳相同,则保存记录。如果它们不同则抛出异常。
这两种方法的区别在于第一种方法使用分离对象的时间戳,而第二种方法使用加载对象的时间戳。原因是计算列。无法在应用程序中更新计算值。