C# EF代码优先:包括不处理可选关系

C# EF代码优先:包括不处理可选关系,c#,entity-framework,lazy-loading,code-first,eager-loading,C#,Entity Framework,Lazy Loading,Code First,Eager Loading,我的代码中有一个特定的查询,需要立即加载所有相关的实体(包括->1 FKs和->N FKs),因为上下文将在这之后立即处理 我创建了一个通用的“查询”方法,它接受params Expression[]includes,然后对它们进行内部链接。那部分很好用 查询如下所示: var item = facade.Query<MyItem>( c => c.Childs.Select(x => x.Parent),

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

我创建了一个通用的“查询”方法,它接受
params Expression[]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);
在所有的包含项中,只有
子项notworking
实际上不起作用。当使用调试器检查返回的对象时,我会在所有属性上看到代理。打开代理将为所有其他关系提供正确的数据,并为
SubChildNotWorking
属性提供“objectcontext已被释放异常”

我所能发现的唯一区别是
子ChildNotWorking
是一个可为空的FK(在DB上有可为空的列,在dbcontext中有可选配置),而其他所有FK都是配置为必需的不可为空的FK

数据库也是一个遗留数据库,不是先用代码创建的,也不是遵循其约定的,我只是在DbContext中进行了映射。其他一切都很好

我正试图弄清楚在可为空的FKs上是否可以进行即时加载,但我找不到任何关于这方面的文档

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

谢谢。

您定义了吗

[DataContract]
关于你的类(实体)?如果是这样,别忘了用

[DataMember] 

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

当您使用include方法时,您正在谈论的是渴望加载模式。具有关系的实体将作为集合加载。对于任何不可为null的外键,有一个小集合开始为空,但对于可为null的外键,则没有。首先在代码中,您可以将导航属性设置为虚拟,但这不是您的情况。您可以尝试直接在上下文中加载它,例如:

var someEntity = context.someEntities.Find(1);
context.Entry(someEntity ).Reference(e => e.EntityWithFKNullable).Load(); 
或较短的版本:

context.EntitiesWithFKNullable.Load();

如果只包含
子项notworking
,而不包含其他子项,会发生什么情况?那么它能工作吗?您能检查SQL看起来是否正确(使用
var SQL=facade.Query(c=>c.Childs.Select(x=>x.SubChildNotWorking)).ToString();
)并在SSMS中手动测试查询是否返回预期的结果行。您能显示SubChildNotWorking的映射及其导航属性吗?已经说明了,它使用WithOptional和nullable FK,而不是WithRequired和非nullable FK,无论如何,我将添加映射代码。在我的场景中,类似的optional foreignkey可以正常工作。看起来,您在db中输入了外键。
context.EntitiesWithFKNullable.Load();