保存后为什么我的关联实体为空?

时间:2013-10-29 00:37:38

标签: .net entity-framework

我有一个与另一个实体有一对一关系的实体。它们在我的实体模型中被适当地连接,并且基础表由FK相关联。

当我拨打.SaveChanges()时,我的实体已保存。我可以看到已经生成的ID和所有相应的值。

我也可以手动查看数据库并查看它已保存正确。

但是,我的代码中的相关实体都是null。它们在上下文菜单中显示为null,并且它们在代码中解析为null ...如果我使用新的Id调用我的get方法,我会得到我期望的实体,再次使用null相关实体。

如果我刷新页面(或重新构建类),那么一切都是正确的。

编辑:更多详情。

在我的特定情况下,我有一个相当于连接表,在事物之间创建依赖关系。

考虑一个名为“Things”的表,其中包含“ThingId”列

然后我有另一个名为“ThingDependencies”的表,其中有三列“DependencyId”,“FromThingId”和“ToThingId”,两者都是FK到Things.ThingId

我已在代码中声明此数据是非循环的。

当我保存新的ThingDependency时,它会相应地显示持久值......即:它具有Id,以及From和To Id值。

... 但关联的实体为空,在我处理数据上下文并重新实例化之前我无法访问它们......然后它就可以了。

2 个答案:

答案 0 :(得分:2)

  

当我保存新的ThingDependency时,它会显示持久值   恰当的......那就是:它有它的Id,以及From和To Id   值。

     

...但关联的实体为空,直到我才能访问它们   我处理数据上下文并重新实例化......然后它就可以了   细

我只能参考你的问题的这部分听起来像(但我的解释可能完全错了)你正在做这样的事情:

int newThingDependencyId = 0;

using (var context = new MyContext())
{
    ThingDependency newThingDependency = new ThingDependency();
    newThingDependency.FromThingId = 1;
    newThingDependency.ToThingId = 2;

    context.ThingDependencies.Add(newThingDependency);

    context.SaveChanges();

    newThingDependencyId = newThingDependency.Id;

    Thing fromThing1 = newThingDependency.FromThing;
    Thing toThing1 = newThingDependency.ToThing;
}

using (var context = new MyContext())
{
    ThingDependency newThingDependency = context.ThingDependencies
        .Find(newThingDependencyId);

    Thing fromThing2 = newThingDependency.FromThing;
    Thing toThing2 = newThingDependency.ToThing;
}

在这里,您想知道为什么fromThing1toThing1null,但fromThing2toThing2不是null,对吧?

如果是,那么你必须替换......

ThingDependency newThingDependency = new ThingDependency();

... ...通过

ThingDependency newThingDependency = context.ThingDependencies.Create();

Create将创建一个动态代理,该代理能够通过延迟加载加载fromThing1toThing1,而使用new运算符创建的普通对象则不会。 Find(或任何LINQ查询,如Single等)也将实例化代理,这是访问第二个上下文中的导航属性的原因。假设您的导航属性标记为virtual而您没有明确禁用延迟加载。

(如果我对这个完全错了,请为所有Thing 的爱情提供一些代码片段,以显示您正在做的事情!)

答案 1 :(得分:0)

Provalvemnete你正在使用Lazy Loading。 尝试在查询中使用“包含(”实体“)。

var employees = db.Employees。包括(x => x.Address)。 ToList();

ATT

Julio Spader

wessolucoes.com.br