我有一个加载显式加载的实体,但是当我尝试访问加载的引用时,它再次加载延迟加载而没有clausule!
我找到的唯一方法是禁用Lazy Loading,我不能!
如果我已经明确加载了引用,我不明白为什么它会再次加载。
这是一个例子(我做了一点简短的演示 目的):
var employee = dbo.Employees
.Where(m => m.StoreId == SessionContext.Store
&& m.Id == 10)
.Include(m => m.Person)
.FirstOrDefault();
if (employee == null)
{
return HttpNotFound();
}
dbo.Entry(employee)
.Collection(m => m.Stocks)
.Query()
.Where(m => ...)
.Load();
// LAZY LOADING HERE
foreach (var stock in employee.Stocks)
{
}
答案 0 :(得分:0)
你必须禁用Lazy Load,EF会在你迭代时尝试获取所有股票
使用“使用块”
包装上下文img
使用Query方法时,通常最好关闭导航属性的延迟加载。这是因为否则整个集合可能会被延迟加载机制自动加载,或者 >>已经执行过滤后的查询。
https://msdn.microsoft.com/en-us/data/jj574232.aspx
否则,如果您不想禁用延迟加载,则必须执行jbl所说的
using(DbContext dbo=new DbContext())
{
//Disable lazy loading
dbo.Configuration.LazyLoadingEnabled=false;
var employee = GetEmployee()...
dbo.Entry(employee)
.Collection(m => m.Stocks)
.Query()
.Where(m => ...)
.Load();
}//Kill the context
// NO LAZY LOADING HERE
foreach (var stock in employee.Stocks)//If you don't disable Lazy Loading, EF will try to fetch all stocks
{
}
答案 1 :(得分:0)
要正常使用,Include()
应该出现在DbSet
对象之后:
var employee = dbo.Employees
.Include(m => m.Person)
.Include(m => m.Stocks)
.Where(m => m.Stocks....)
.FirstOrDefault(m => m.StoreId == SessionContext.Store
&& m.Id == 10);