我的代码中有一个特定的查询,它需要预先加载所有相关实体(->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);
不工作属性的映射(放置在 SubChildNotWorking 的配置中):
this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey);
在所有包含中,只有 SubChildNotWorking
实际上不起作用。当使用调试器检查返回的对象时,我看到了所有属性的代理。打开代理为我提供了所有其他关系的正确数据,并为 SubChildNotWorking
提供了“对象上下文已被处理的异常”。属性(property)。
我能发现的唯一区别是 SubChildNotWorking
是一个可为空的 FK(在 DB 上具有可为空的列,在 dbcontext 中具有 WithOptional 配置),而所有其他都是使用 WithRequired 配置的不可为空的 FK。
该数据库也是一个遗留数据库,不是使用 Code First 创建的,也没有遵循其约定,我只是在 DbContext 中进行了映射。其他一切正常。
我想弄清楚预加载是否不适用于可为空的 FK,但我找不到任何相关文档。
这是错误还是预期的行为?但最重要的是,我该如何解决这个问题?
谢谢。
最佳答案
你定义了吗
[DataContract]
在你的类(class)(实体)?如果是这样,请不要忘记用
注释您的 SubChild[DataMember]
或者当您对实体执行 GET 调用时,它可能最终加载但未显示。
关于c# - EF 代码优先 : Include not working on optional relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10101895/