实体框架4.1 -默认的FK的EntityState
本文关键字:FK EntityState 默认 框架 实体 | 更新日期: 2023-09-27 18:04:32
我有一个小问题与ASP。. NET MVC和实体框架我有一个名为"UF"的实体和另一个名为"Pais"的实体,它们有这样的关系:
UF [* ... 0..1] Pais
我可以使用导航属性直接从UF访问Pais对象:
UF.Pais.Whatever = "foobar";
目前我有一个视图插入一个新项目到数据库中,它有一个编辑器为"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。其他属性,如描述,目前为空。当我执行SaveChanges时,"uf"answers"uf"。"Pais"的状态为"添加"。"uf"的正确状态。"Pais"应该是Unchanged,因为它已经存在于数据库中。
我的问题是:有一些方法可以将默认关系EntityState更改为Unchanged?下面的代码解决了这个问题,但是将它添加到每个函数并向数据库添加一个新条目(以及每个FK)是多余的!
db.ObjectStateManager.ChangeObjectState(uf.Pais, EntityState.Unchanged);
就是这样。我不确定我是否说得够清楚。如果需要,请随时询问更多信息。很抱歉有任何英语错误!
谢谢,
里卡多
PS: "Pais"代表国家,"UF"代表州。
我的问题是:有一些方法可以改变默认关系
EntityState
forUnchanged
?
是通过调用Attach代替Unchanged
。
下面的代码解决了这个问题,但是将它添加到每个函数中在数据库中添加一个新条目(对于每个FK)是多余的!
不,这不是多余的,这是一个解决方案,因为Attach
或AddObject
总是对实体图中的所有实体和关联进行操作。这意味着调用AddObject
将使上下文尚未意识到的所有内容变为Added
,而Attach
将使上下文尚未意识到的所有内容变为Unchanged
(因此您将依次将每个修改或插入的实体设置为正确的状态)。如果你使用分离实体,这就是EF的工作方式。
这个问题的另一个解决方案是在添加UF
之后进行连接:
// Here UF.Pais is null
db.UFs.AddObject(uf);
// Create dummy Pais
var pais = new Pais { Id = "Codigo" };
// Make context aware of Pais
db.Pais.Attach(pais);
// Now make the relation
uf.Pais = pais;
db.SaveChanges();
如果你正在处理分离的实体,你总是负责为每个实体(和独立的关联)设置正确的状态。因此,您要么使用附加实体让EF为您创造奇迹(如示例所示),要么使用您不喜欢的方法。在更复杂的场景中,您可以发现最好的方法是再次加载实体图,并将传入的更改合并到附加的图中。