1

我有一个简单的 DbContext 模型,其中包含两个实体 Product 和 Order,以及它们之间的单个多 2 多关联。我正在尝试为产品实例显式加载特定的关联订单。因此,我从显式加载产品实例的所有订单开始:

context.Entry(product).Collection(x=>x.Orders).Load();

product.Orders 现在包含所有关联的订单。到现在为止还挺好。现在我想通过使用 '.Query()' 方法进行更具体的查询,如下所示:

context.Entry(product).Collection(x=>x.Orders).Query().Load();

令人惊讶的是,product.Orders 现在是空的!

根据文档,Query() 方法应返回“用于从数据库加载此集合的查询”。手动执行 ObjectQuery 确实会产生预期的结果。

我做错了什么,或者这是 EF 中的错误?

在此先感谢您的帮助。

亲切的问候,梅林

4

1 回答 1

1

不同之处在于第二条语句(with Query().Load())仅将订单加载到上下文中,而不是在集合中它只是一个运行的查询,它不知道它应该填充的任何集合。

您可以通过列出来验证这一点context.Orders.Local。之后Query().Load()它将包含属于 的订单product

如果product.Orders之后允许延迟加载,您会看到正在执行相同的查询,但现在要填充集合。

编辑
在清除我的头脑并将多对多、一对多、懒惰/非懒惰分开之后,我可以完全重现您的问题。加载m:m 导航属性.Query().Load(),而 1:n 导航属性是。不过,在这两种情况下都会加载该Local集合。

所以,很好的收获!

于 2012-11-23T20:41:54.640 回答