实体框架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"代表州。

实体框架4.1 -默认的FK的EntityState

我的问题是:有一些方法可以改变默认关系EntityState for Unchanged ?

是通过调用Attach代替Unchanged

下面的代码解决了这个问题,但是将它添加到每个函数中在数据库中添加一个新条目(对于每个FK)是多余的!

不,这不是多余的,这是一个解决方案,因为AttachAddObject总是对实体图中的所有实体和关联进行操作。这意味着调用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为您创造奇迹(如示例所示),要么使用您不喜欢的方法。在更复杂的场景中,您可以发现最好的方法是再次加载实体图,并将传入的更改合并到附加的图中。