我试图访问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
),但没有运气。我做错了什么?
答案 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
中一次加载一行。这样做允许读者在其他任何尝试访问它之前打开和关闭。