我需要一些帮助来解决这个错误"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)
我知道当第二次下拉列表中的问题发生时,它尝试在前一个查询关闭连接时检索数据.请帮帮我,谢谢.
修复很简单 - 在使用之前转换为.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;
}
}
}
反正这样的东西:)