2012-04-11 96 views
9

我在我的代码中需要加载所有相关实体(都是 - > 1 FK和 - > N FK)的特定查询,因为上下文将在。EF代码优先:包括不工作的可选关系

我做了一个通用的“查询”方法,需要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属性提供了“对象上下文已处理异常”。

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

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

我想弄清楚,如果急于加载不能在可空的FK上工作,但我找不到任何有关该文件的文档。

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

谢谢。

+0

如果你只包括没有其他subchildren了'SubChildNotWorking'会发生什么?那它有用吗? – Slauma 2012-04-11 11:38:18

+0

不是。也不起作用。 – 2012-04-11 11:53:20

+1

您可以检查SQL查看是否正确(使用'var sql = facade.Query (c => c.Childs.Select(x => x.SubChildNotWorking))。ToString();')并手动测试查询SSMS是否返回预期的结果行。 – Slauma 2012-04-11 12:05:24

回答

0

你有没有在你的类(实体)定义

[DataContract] 

?如果是的话,不要忘记用

[DataMember] 

来注释SubChild或者它可能最终会加载,但没有显示出来,当你进行实体上的GET调用。

0

当您使用include方法时,您正在讨论热切加载模式。具有关系的实体将作为集合加载。对于任何不可空的外键,都有一个简单的集合开始为空,但对于可为空的集合,没有。在代码中,您可以使导航属性变为虚拟,但这不是您的情况。您可以尝试直接加载上下文,例如:

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

或较短的版本:

context.EntitiesWithFKNullable.Load();