1

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

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

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

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

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

编辑:更多细节。

在我的具体情况下,我有一个连接表,在事物之间创建依赖关系。

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

然后我有另一个名为“ThingDependencies”的表,其中包含三列“DependencyId”、“FromThingId”和“ToThingId”,这两个列都是 FKThings.ThingId

我在代码中断言这个数据是非循环的。

当我保存一个新的ThingDependency时,它会适当地显示持久的值......也就是说:它有它的 Id,以及 From 和 To Id 值。

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

4

2 回答 2

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但又不是fromThing2,对吗?toThing2null

如果是,那么您必须更换...

ThingDependency newThingDependency = new ThingDependency();

...经过...

ThingDependency newThingDependency = context.ThingDependencies.Create();

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

(如果我对此完全错误,请在您Thing问题中提供一些代码片段,以显示您在做什么!)

于 2013-10-31T17:48:17.820 回答
0

Provalvemnete 您正在使用延迟加载。尝试在您的查询中使用“包含(”实体“)。

var 员工 = db.Employees。包括 (x => x.Address)。列表();

攻击者

胡里奥·斯派德

wessolucoes.com.br

于 2013-10-29T01:59:36.623 回答