我最近正在使用它来将实体EF添加到我的数据库中:
ctx.Entry(payment).State = payments.ID == 0 ? EntityState.Added : EntityState.Modified;
代替普通的
ctx.Payments.Add(payments);
第二个很好,因为我可以选择添加还是删除。
第一个和第二个方法之间的真正区别是什么?为何没有简单的更新项目?如:
ctx.Payments.Update(payments);
哪个会“镜像” EntityState.Modified
那个?
这是我正在使用的代码,将ViewModel
的{{1}}设置为MVC Action/Controller
的上下文:
EF
答案 0 :(得分:2)
通过设置状态来添加分离实体与调用Add
之间没有区别。
您可以在InternalEntityEntry.cs
(由DbEntityEntry
包装)中看到,将状态设置为Added
最终只是调用InternalSet.Add
。您可以在DbSet`.cs
中看到,调用Add
也只会最终调用InternalSet.Add
。它们的前提条件略有不同,但是在您的情况下,两者的前提条件都满足。
在您的情况下,关于第一种方法的好处是,同一段代码既可以添加实体,也可以附加实体并将其标记为已修改。如您所述,没有将状态设置为Modified
的单一方法。
第二个很好,因为我可以选择添加还是删除。
您还可以将状态设置为Deleted
,所以这不是彼此相比的优势。
为什么没有简单的更新项目?
很可能是因为它的唯一用例是从EF角度看您正在做一些奇怪的事情。分离,序列化,修改,反序列化和重新连接实体可能是您框架中的标准,但是从EF的角度来看,这些是高级低级操作,在某些情况下出错的风险会有所增加。例如,当您的模型包含用于并发检查的任何可修改属性时,序列化/反序列化会丢失该属性的原始值,这意味着并发检查肯定会失败。