3

鉴于:

    public ActionResult List()
    {
        using (var unitOfWork = new UnitOfWork())
        {
            var result = unitOfWork.Repository.Find<EntityAddress>(a => a.PostalCode == "80001");
            //return View(result.ToList());//NO Exception raised with ToList()
            return View(result);//EXCEPTION RAISED IN VIEW DURING ITERATION
        }            
    }

UnitOfWork是一次性的,可以处理我的 DbContext。它还禁用构造函数中的延迟加载:

    public UnitOfWork()
    {
        _dbContext.Configuration.LazyLoadingEnabled = false;
        Repository = new GenericRepository<MyEntities>(_dbContext);            
    }

    public void Dispose()
    {
        Repository.Dispose();
    }

Find<EntityAddress>()实施的结果是:

_dbContext.Set<EntityAddress>().Where(predicate)其中 predicate 是类型的参数Expression<Func<EntityAddress, bool>>

为什么即使在禁用延迟加载后仍会出现处理异常?

4

1 回答 1

7

延迟加载和急切加载与加载与查询相关的实体(例如导航属性和集合)时有关,而不是在加载查询本身的内容时。

从您的IQuerable<EntityAddress>存储库返回的 - 无论您是否启用了延迟加载 - 将不会在服务器上运行查询,直到它被枚举(无论是通过在foreach循环中获取枚举器,调用Enumerable.ToList<TSource>它,还是将其传递给Controller.View下游的调用渲染)。

在这种情况下出现异常的原因是因为Controller.View不会立即呈现视图(因此不会立即枚举查询)。它所做的只是构造一个ViewResult保存模型参数(您的查询对象)的实例,直到 MVC 稍后在您处理完上下文之后渲染视图。

如果要将查询结果传递给视图,有两种选择:

  1. 将数据库上下文的生命周期延长到控制器的生命周期
  2. Enumerable.ToList<EntityAddress>IQuerable<EntityAddress>释放数据库上下文之前调用,并使用结果List<EntityAddress>而不是IQuerable<EntityAddress>.
于 2013-08-15T21:18:04.123 回答