9

我的代码中有一个特定查询,它需要急切加载所有相关实体(->1 FK 和 ->N FK),因为在此之后将立即处理上下文。

我做了一个通用的“查询”方法,params Expression<Func<MyItem, object>>[] includes然后在内部链接它们。那部分工作正常。

查询如下所示:

var item = facade.Query<MyItem>(
                c => c.Childs.Select(x => x.Parent),
                c => c.Childs.Select(x => x.SubChild1),
                c => c.Childs.Select(x => x.SubChildNotWorking),
                c => c.Childs.Select(x => x.SubChild2),
                c => c.Childs.Select(x => x.SubChild3),
                c => c.Childs.Select(x => x.SubChildrens)
                ).FirstOrDefault(c => c.Name == name);

not working 属性的映射(放置在 SubChildNotWorking 的配置中):

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey);

在所有包含中,只有SubChildNotWorking实际不起作用。当使用调试器检查返回的对象时,我看到了所有属性的代理。打开代理为我提供了所有其他关系的正确数据,以及该属性的“对象上下文已被处理异常” SubChildNotWorking

我能够发现的唯一区别是它SubChildNotWorking是一个可为空的 FK(在 DB 上具有可为空的列,在 dbcontext 中具有 WithOptional 配置),而所有其他的都是配置有 WithRequired 的不可为空的 FK。

该数据库也是一个遗留数据库,不是使用 Code First 创建的,也没有遵循其约定,我只是在 DbContext 中进行了映射。其他一切正常。

我试图弄清楚急切加载是否不适用于可为空的 FK,但我找不到任何有关此的文档。

这是一个错误,还是预期的行为?但最重要的是,我该如何解决这个问题?

谢谢。

4

2 回答 2

0

你定义了吗

[DataContract]

在你的班级(实体)上?如果是这样,不要忘记用

[DataMember] 

或者当您对实体执行 GET 调用时,它可能最终会加载但不显示。

于 2013-10-22T17:25:12.003 回答
0

当您使用 include 方法时,您谈论的是急切加载模式。具有关系的实体将作为集合加载。对于任何不可为空的外键,都有一个从空开始的普通集合,但对于可空的外键,则没有。在 Code First 中,您可以将导航属性设为虚拟,但这不是您的情况。您可以尝试直接在 Context 上加载它,例如:

var someEntity = context.someEntities.Find(1);
context.Entry(someEntity ).Reference(e => e.EntityWithFKNullable).Load(); 

或更短的版本:

context.EntitiesWithFKNullable.Load();
于 2017-11-15T15:47:46.747 回答