在我的应用程序中,我有一个实体,它在用户和项目实体之间基本上被用作多对多的复合体。我试图确定如何确定我的服务层是否需要将实体添加到上下文或附加实体(用于更新现有实体)并且我不知道如何。
由于Int
Id字段,很容易确定我的大多数实体,如果它为零,则数据库尚未为其提供标识值。如果它是复合主键,则无法进行此操作。
有没有人对如何确定某个实体的实例是新的还是对现有记录的更新有任何建议?
编辑:我忘了提及,这些实体是为代码优先构建的POCO,因此我没有实体本身的EntityState属性。
答案 0 :(得分:6)
是的,正如上面的答案所述,您检查OSM中实体的 EntityState 。
但是,请记住,这仅适用于附加到上下文/图表的实体。
我目前正在使用分离的实体(ASP.NET MVC),并且因为它们没有附加到图形,所以EntityState没有改变。
在这种情况下,我正在对数据库进行预防性调用以通过密钥获取实体。如果没有返回,我执行添加,否则我使用 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();
答案 1 :(得分:3)
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