我在ASP.NET MVC和Entity Framework 4中遇到了一个小问题。我有一个名为“UF”的实体和另一个名为“Pais”的实体,他们有这种关系:
UF [* ... 0..1] Pais
我可以使用导航属性直接从UF访问Pais对象:
UF.Pais.Whatever = "foobar";
目前我有一个View,它将一个新项目插入数据库,它有一个“Pais.Codigo”编辑器(“Codigo”是Pais的主键)。因此,当我插入新的UF时,框架会创建一个类UF的实例,并引用类Pais的实例。然后就完成了:
if (ModelState.IsValid)
{
db.UFs.AddObject(uf);
db.SaveChanges();
return View();
}
问题是EF正在将新的Pais插入到数据库中,因此它基本上忽略了现有的Pais。
例如,假设我的对象UF具有ID为1的Pais.uf.Pais.Codigo的当前值为1.其他属性(如描述)当前为null。当我执行SaveChanges时,“uf”和“uf.Pais”都处于Added状态。 “uf.Pais”的正确状态应该是Unchanged,因为它已经存在于数据库中。
我的问题是:有哪些方法可以更改默认关系EntityState for Unchanged?下面的代码解决了这个问题,但是将它添加到每个函数并向数据库中添加一个新条目(对于每个FK)都是过度的!
db.ObjectStateManager.ChangeObjectState(uf.Pais, EntityState.Unchanged);
就是这样。我不确定我是否足够清楚。如果需要,请随时询问更多信息。抱歉任何英语错误!
谢谢,
里卡多
PS:“Pais”代表国家,“UF”代表州。
答案 0 :(得分:0)
我的问题是:有一些方法可以改变默认关系
EntityState
的{{1}}?
是通过调用Attach而不是Unchanged
。
以下代码解决了问题,但将其添加到每个函数中 with为数据库添加一个新条目(对于每个FK)是过度的!
不,它不是矫枉过正,这是一个解决方案,因为Unchanged
或Attach
将始终对实体图中的所有实体和关联进行操作。这意味着调用AddObject
会使所有上下文都无法识别,因为AddObject
和Added
会使上下文不知道的所有内容都为Attach
(所以你会反过来必须将每个修改或插入的实体设置为正确的状态)。如果您使用分离的实体,这就是EF的工作原理。
问题的另一个解决方案是在添加Unchanged
之后建立连接:
UF
如果您正在使用分离的实体,则始终负责设置correct state for each entity(以及independent association)。因此,您将使用附加实体让EF为您制作魔法(如示例所示),或者您将使用您不喜欢的方法。在更复杂的场景中,您可以发现最佳方法是再次加载实体图并将传入的更改合并到附加图中。