实体框架中的非可空导航属性为null

时间:2014-01-27 16:03:25

标签: c# entity-framework c#-4.0 ef-model-first

我们遇到了实体框架,为非可空关系返回NULL值。我们首先工作模型。 当实体的关系在不同的上下文中更改时(或在我们的实际用例中:不同的线程),会出现问题。
- 如果尚未调用导航属性,则返回null - 如果在OR之前调用了导航属性HAS,则实体中包含外键属性,它将返回最后一个已知值。

  • 为模型启用了延迟加载
  • 我已经为Entity framework 4.0和6.0测试了这个,它们都产生了相同的结果

这是一个示例模型:

enter image description here

这是演示此问题的一些示例测试代码。

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值的非可空实体是意料之外的,我们的代码中根本没有考虑过(我们为什么要首先考虑?)

1 个答案:

答案 0 :(得分:0)

替换

context.DossierSet.Single(x => x.Id == ID);

context.DossierSet.Include(x => x.Fase).Single(x => x.Id == ID);