EF导航属性不加载

时间:2015-02-10 21:16:22

标签: c# asp.net asp.net-mvc linq entity-framework

我试图访问Item的{​​{1}}导航属性。但是,当我尝试运行它时,我收到OrderDetail并出现以下错误:InvalidOperationException。奇怪的是,当我运行逐步调试时,一切都很好,我可以看到项目和页面呈现没有任何问题,当且仅当我正在调查{在通过There is already an open DataReader associated with this Command which must be closed first.orderDetails集合中获取项目之前,{1}}下至特定OrderDetail

orderDetails

我试图添加一个Include(所以LINQ的第二行是foreach),但没有运气。我做错了什么?

1 个答案:

答案 0 :(得分:0)

将您的查询更改为:

db.OrderDetails.Include(od => od.Item) // use Include to eager load navigation property
                    .Join(db.Orders, // join another table
                    od => od.OrderId, // using this foreign key
                    o => o.Id, // and this primary key
                    (od, o) => new {OrderDetail = od, Order = o}) // project the result of the join into new objects
                    .Select(x => x.OrderDetails).ToList(); // select the one you want and enumerate it immediately

我不确定Linq中的确切等价物,但是这应该为你加载Item属性。

我猜你在SelectItemEditorViewModel内的某个地方调用了dbContext。 EF尽可能延迟执行;它只会返回可能允许它完成你想要的工作的最小可能数据集(因此,所有Include()都强制执行加载)。调用ToList()ToArray()会强制它在调用时将整个集合加载到内存中,而不是在foreach中一次加载一行。这样做允许读者在其他任何尝试访问它之前打开和关闭。