Kal*_*exx 5 c# entity-framework entity-framework-4
在我的应用程序中,我有一个实体,它在用户和项目实体之间基本上被用作多对多的复合体.我试图确定如何确定我的服务层是否需要将实体添加到上下文或附加实体(用于更新现有实体),我不知道如何.
由于IntId字段,这很容易确定我的大多数实体,如果它为零,数据库还没有给它一个标识值.如果它是复合主键,则这是不可能的.
有没有人对如何确定实体的实例是新的还是对现有记录的更新有任何建议?
编辑:我忘了提到,这些实体是为代码优先构建的POCO,因此我没有实体本身的EntityState属性.
是的,如上面的答案所述,您检查OSM中实体的EntityState.
但是,请记住,这仅适用于附加到上下文/图表的实体.
我目前正在使用分离实体(ASP.NET MVC),并且由于它们未附加到图形,因此EntityState保持不变.
在这种情况下,我正在对DB进行预防性调用以通过密钥获取实体.如果没有返回任何内容,我执行Add,否则我使用ApplyCurrentValues来覆盖值,然后执行.SaveChanges
我仍然想知道这是不是正确的方法,但我想我会把它放在那里.
我正在使用没有变化跟踪的POCO,因此我需要做更多的工作.
由于POCO没有EntityState,您必须手动调用OSM:
var pocosInGraph = ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
Run Code Online (Sandbox Code Playgroud)
附加/添加后,您的POCO应该在该集合中.
正如我所说的,如果这是用于MVC应用程序,则您的实体在HTTP POST上分离,因此EntityState仍将保持不变.
在我的例子中,我在附加后手动设置EntityState:
ctx.Attach(poco);
ctx.ObjectStateManager.ChangeObjectState(poco, EntityState.Modified);
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2555 次 |
| 最近记录: |