繁体   English   中英

如何判断EF4实体是新实体还是现有记录?

[英]How do you tell if an EF4 entity is new or an existing record?

在我的应用程序中,我有一个实体,它在用户和项目实体之间基本上被用作多对多的复合体。 我试图确定如何确定我的服务层是否需要将实体添加到上下文或附加实体(用于更新现有实体),我不知道如何。

由于Int Id字段,这很容易确定我的大多数实体,如果它为零,则数据库尚未为其提供标识值。 如果它是复合主键,则这是不可能的。

有没有人对如何确定实体的实例是新的还是对现有记录的更新有任何建议?

编辑 :我忘了提到,这些实体是为代码优先构建的POCO,因此我没有实体本身的EntityState属性。

是的,如上面的答案所述,您检查OSM中实体的EntityState

但是,请记住,这仅适用于附加到上下文/图表的实体。

我目前正在使用分离实体(ASP.NET MVC),并且由于它们未附加到图形,因此EntityState保持不变。

在这种情况下,我正在对DB进行预防性调用以通过密钥获取实体。 如果没有返回任何内容,我执行Add,否则我使用ApplyCurrentValues来覆盖值,然后执行.SaveChanges

我仍然想知道这是不是正确的方法,但我想我会把它放在那里。

我正在使用没有变化跟踪的POCO,因此我需要做更多的工作。

由于POCO没有EntityState,您必须手动调用OSM:

var pocosInGraph = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)

附加/添加后,您的POCO应该在该集合中。

正如我所说的,如果这是用于MVC应用程序,则您的实体在HTTP POST上分离,因此EntityState仍将保持不变。

在我的例子中,我在附加后手动设置EntityState:

ctx.Attach(poco);
ctx.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified);
ctx.SaveChanges();
if (x.EntityState == System.Data.EntityState.Added)
//Add
else if (x.EntityState == System.Data.EntityState.Modified)
//Attach

了解更多信息

http://msdn.microsoft.com/en-us/library/system.data.entitystate.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM