我们遇到了实体框架,为非可空关系返回NULL
值。我们首先工作模型。
当实体的关系在不同的上下文中更改时(或在我们的实际用例中:不同的线程),会出现问题。
- 如果尚未调用导航属性,则返回null
- 如果在OR之前调用了导航属性HAS,则实体中包含外键属性,它将返回最后一个已知值。
这是一个示例模型:
这是演示此问题的一些示例测试代码。
int ID;
using (Model1Container1 context = new Model1Container1())
{
Dossier d = new Dossier();
d.Fase = new Fase();
context.DossierSet.AddObject(d);//generate new object with relationship
context.SaveChanges();
ID = d.Id;
}
using (Model1Container1 context = new Model1Container1())
{
Dossier storedDossier = context.DossierSet.Single(x => x.Id == ID);//retrieve the saved entity
using (Model1Container1 context2 = new Model1Container1())
{
Dossier faseDossier = context2.DossierSet.Single(x => x.Id == ID);//modify the saved entity in a different context
faseDossier.Fase = new Fase();
context2.SaveChanges();
}
Console.WriteLine(storedDossier.Fase.Id);//attempt to read the changed property. NULL exception here on storedDossier.Fase
}
此代码不使用我们实际情况中的线程,但它描述了同样的问题。在实际应用程序中,在不同的PC上可以有一个完全不同的应用程序来修改数据库中的实体。
这里的问题是,为什么会出现这种情况?这可能是实体框架中的错误吗?
我们很清楚,实体框架无法检索由于延迟加载而实例化实体时存在的关系,但为什么不加载已更改的关系呢?突然接收NULL
值的非可空实体是意料之外的,我们的代码中根本没有考虑过(我们为什么要首先考虑?)
答案 0 :(得分:0)
替换
context.DossierSet.Single(x => x.Id == ID);
与
context.DossierSet.Include(x => x.Fase).Single(x => x.Id == ID);