加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – “操作无法完成,因为DbContext已被处理”异常并且禁用了延

发布时间:2020-12-16 01:56:46 所属栏目:百科 来源:网络整理
导读:鉴于: public ActionResult List() { using (var unitOfWork = new UnitOfWork()) { var result = unitOfWork.Repository.FindEntityAddress(a = a.PostalCode == "80001"); //return View(result.ToList());//NO Exception raised with ToList() return Vi
鉴于:

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>().其中??(谓词)其中谓词是Expression< Func< EntityAddress,bool>>类型的参数.

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

解决方法

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

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

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

如果要将查询结果传递给视图,则有两个选项:

>将数据库上下文的生命周期延长到控制器的生命周期
>在IQuerable< EntityAddress>上调用Enumerable.ToList<EntityAddress>在处理数据库上下文之前,使用生成的List< EntityAddress>而不是IQuerable< EntityAddress>.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读