我的代码中有一个特定的查询,需要急切加载所有相关实体(两个 - > 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
属性的“objectcontext已被处理异常”。
我能够发现的唯一区别是SubChildNotWorking
是可以为空的FK(DB上有可空列和dbcontext中的WithOptional配置),而所有其他都是使用WithRequired配置的不可空FK。 / p>
数据库也是一个未使用Code First创建的遗留数据库,并且不遵循其约定,我只是在DbContext中进行了映射。其他一切都很好。
我想弄清楚,如果急切加载对可空的FK不起作用,但我找不到任何关于它的文档。
这是一个错误,还是预期的行为?但最重要的是,我该如何解决这个问题?
感谢。
答案 0 :(得分:0)
您定义了
吗?[DataContract]
你的班级(实体)上的?如果是这样,请不要忘记使用
注释您的SubChild[DataMember]
或者它可能最终加载但在您对实体执行GET调用时不会显示。
答案 1 :(得分:0)
当您使用include方法时,您谈论的是急切的加载模式。具有关系的实体将作为集合加载。对于任何不可空的外键,有一个简单的集合从空开始,但对于可空的外键,则没有。在Code First上,您可以将导航属性设置为虚拟,但事实并非如此。您可以尝试直接在Context上加载它,例如:
var someEntity = context.someEntities.Find(1);
context.Entry(someEntity ).Reference(e => e.EntityWithFKNullable).Load();
或更短的版本:
context.EntitiesWithFKNullable.Load();