asp.net mvc ObjectDisposedException with ef

Jac*_*ack 3 asp.net-mvc-3

我需要一些帮助来解决这个错误"ObjectContext实例已被处理,不能再用于需要连接的操作."

它是一个asp.net mvc3,EF4和ms sql.这是剃须刀,有两个下拉菜单:

<div class="editRow">
@Html.DropDownListFor(m=>m.IndustryId, (SelectList)ViewBag.Industry, @Empower.Resource.General.ddlDefaultVal, new { @class = "ddl400" })
@Html.ValidationMessageFor(m => m.IndustryId)
</div>
<div class="editRow">
@Html.DropDownListFor(m=>m.ProvinceId, (SelectList)ViewBag.Province, @Empower.Resource.General.ddlDefaultVal, new {@class = "ddl400"})
 @Html.ValidationMessageFor(m => m.ProvinceId)   
</div>
Run Code Online (Sandbox Code Playgroud)

控制器:

 IndustryService indService = new IndustryService();
ViewBag.Industry = new SelectList(indService.GetAllIndustry(), "IndustryId", "IndustryName");
ProvinceService proService = new ProvinceService();
ViewBag.Province = new SelectList(proService.GetAllProvince(), "ProvinceId", "ProvinceName");
 return View();
Run Code Online (Sandbox Code Playgroud)

ProvinceService:

public IEnumerable<Province> GetAllProvince()
        {
            using (var context = DBContext.ObjectContext)
            {
                var pros = context.Provinces;
                return pros;
            }
        }
Run Code Online (Sandbox Code Playgroud)

IndustryService与上述相同......

public class DBContext
    {
        private static EmpowerDBEntities _empowerContext;
        public static EmpowerDBEntities ObjectContext
        {
            get
            {
                if (_empowerContext == null)
                    _empowerContext = new EmpowerDBEntities();
                return _empowerContext;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我知道当第二次下拉列表中的问题发生时,它尝试在前一个查询关闭连接时检索数据.请帮帮我,谢谢.

Ada*_*SFT 6

修复很简单 - 在使用之前转换为.ToList()或First().LINQ已经推迟执行,并试图上下文配置后才能运行此命令(当你的目标结果被引用) -不是当你真正拨打电话.您需要强制它运行现在,而背景是在范围内.

using (var context = DBContext.ObjectContext)
{
     var pros = context.Provinces;
     return pros.ToList();
}

另外 - 上面的代码是在get访问器中检查null.但是这个对象不会为空 - 它将被处理掉,所以你不能用这种方式进行检查,你需要检查它是否为null而不是处理掉.


public class DBContext
    {
        private static EmpowerDBEntities _empowerContext;
        public static EmpowerDBEntities ObjectContext
        {
            get
            {
                if (_empowerContext == null || _empowerContext.IsDisposed())
                    _empowerContext = new EmpowerDBEntities();
                return _empowerContext;
            }
        }
    }

反正这样的东西:)