Entity framework EntityFramework:EF 5.0中可能存在多2多个错误?

Entity framework EntityFramework:EF 5.0中可能存在多2多个错误?,entity-framework,Entity Framework,我有一个简单的DbContext模型,其中包含两个实体Product和Order,以及它们之间的单个多2多关联。我正在尝试显式加载产品实例的特定关联订单。因此,我从显式加载产品实例的所有订单开始: context.Entry(product).Collection(x=>x.Orders).Load(); product.Orders现在包含所有关联的订单。到现在为止,一直都还不错。现在我想使用“.query()”方法进行更具体的查询,如下所示: context.Entry(produc

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

context.Entry(product).Collection(x=>x.Orders).Load();
product.Orders现在包含所有关联的订单。到现在为止,一直都还不错。现在我想使用“.query()”方法进行更具体的查询,如下所示:

context.Entry(product).Collection(x=>x.Orders).Query().Load();
令人惊讶的是,产品。订单现在是空的

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

是我做错了什么,还是这是EF中的错误

提前感谢你的帮助

亲切问候,,
Merijn

区别在于第二条语句(带有
Query().Load()
)只将订单加载到上下文中,而不加载到集合中。它只是一个运行的查询,它不知道应该填充什么集合

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

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

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


所以,接得好

区别在于第二条语句(带有
Query().Load()
)只将订单加载到上下文中,而不是集合中。它只是一个运行的查询,它不知道应该填充什么集合

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

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

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


所以,接得好

嗨,谢谢你的回复。两个问题:第一个问题:这是否与Julia和Rowan在他们的书“编程实体框架DbContext”第41页“显式加载导航属性内容的子集”一节中所写的相反?第二个问题:如果我像你建议的那样调用load方法,那么实际上订单是在上下文中加载的。但是如何在收集产品订单中也获得它们。我试图调用DetectChanges(),但没有效果。这是因为product order是一个m2m关系吗?这里让人困惑的是,延迟加载集合在寻址时总是会与所有对象一起重新加载,或者在上下文处理后访问它时会出现“上下文处理”异常。因此,这只适用于非惰性集合(我使用惰性集合进行了测试)。所以,是的,你是对的,
product.Orders
应该包含订单。我会看看我是否会修改我的答案,或者在适当的时候删除它。再次感谢你的帮助。但是我的第二个问题呢?问题是,我想删除产品和订单之间的m2m关系。我可以通过调用product.Orders.load()来加载产品的所有m2m关系,但这对我来说似乎不是很有效。我更喜欢在不加载的情况下加载(如果EF允许我将订单附加到product.Orders),否则我只想加载给定产品和订单密钥的一个m2m关联。我觉得这是不可能的。我是对的,或者我该怎么做?是的,你是对的,因为这个错误(或功能?),如果你想更改产品订单关联中的任何内容,你必须加载整个订单集合。或者,您必须将关联表拉入类模型中,这将使您能够(例如)按订单id和产品id删除关联。也许是一个安慰:我经常看到隐藏的关联表迟早会出现在类模型中,因为新出现的存储关联详细信息的要求(如建立日期、序列号等)。如果我理解正确,这意味着在我的模型中删除m2m,并在任何地方使用链接表。对吗?我提到的这个附加方法怎么样。它作为Vnext的一个功能会有变化吗?嗨,谢谢你的回答。两个问题:第一个问题:这与Julia和Rowan在第41页第节中所写的相比吗在他们的书“Programming Entity Framework DbContext”中“显式加载导航属性内容的子集”?第二个问题:如果我按照您的建议调用load方法,那么确实会在上下文中加载订单。但是如何在collection Product.orders中也获取订单。我尝试调用DetectChanges()没有效果。这是因为产品订单是m2m关系吗?这里令人困惑的是,延迟加载集合在寻址时总是使用所有对象重新加载,或者在上下文处理后访问时出现“上下文处理”异常而失败。因此,这仅对非延迟集合有意义(我测试了懒惰的人)。所以,是的,你是对的,
product.Orders
应该包含订单。我会看看是否会修改我的答案,或者在适当的时候删除它。再次感谢你的帮助。但是我的第二个问题呢?问题是,我想删除一个