EntityState.Added和Add()有什么区别?

时间:2018-07-16 06:57:40

标签: asp.net-mvc entity-framework crud

我最近正在使用它来将实体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

1 个答案:

答案 0 :(得分:2)

通过设置状态来添加分离实体与调用Add之间没有区别。

您可以在InternalEntityEntry.cs(由DbEntityEntry包装)中看到,将状态设置为Added最终只是调用InternalSet.Add。您可以在DbSet`.cs中看到,调用Add也只会最终调用InternalSet.Add。它们的前提条件略有不同,但是在您的情况下,两者的前提条件都满足。

在您的情况下,关于第一种方法的好处是,同一段代码既可以添加实体,也可以附加实体并将其标记为已修改。如您所述,没有将状态设置为Modified的单一方法。

  

第二个很好,因为我可以选择添加还是删除。

您还可以将状态设置为Deleted,所以这不是彼此相比的优势。

  

为什么没有简单的更新项目?

很可能是因为它的唯一用例是从EF角度看您正在做一些奇怪的事情。分离,序列化,修改,反序列化和重新连接实体可能是您框架中的标准,但是从EF的角度来看,这些是高级低级操作,在某些情况下出错的风险会有所增加。例如,当您的模型包含用于并发检查的任何可修改属性时,序列化/反序列化会丢失该属性的原始值,这意味着并发检查肯定会失败。