延迟加载忽略显式加载

时间:2015-09-01 13:14:45

标签: asp.net-mvc entity-framework lazy-loading eager-loading

我有一个加载显式加载的实体,但是当我尝试访问加载的引用时,它再次加载延迟加载而没有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)
        {
        }

2 个答案:

答案 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);