asp.net-mvc-3 - asp.net mvc ObjectDisposedException 与 ef

标签 asp.net-mvc-3

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

它是 asp.net mvc3、EF4 和 ms sql。 这是带有两个下拉菜单的 Razor :

<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>

Controller :

 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();

省服务:

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

IndustryService 和上面一样...

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

我知道问题出现在第二个下拉列表中,当它试图在连接被先前的查询废弃时检索数据。请帮我解决这个问题,谢谢。

最佳答案

修复很简单 - 在使用前转换为 .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;
            }
        }
    }

反正就是这样:)

关于asp.net-mvc-3 - asp.net mvc ObjectDisposedException 与 ef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6839626/

相关文章:

asp.net-mvc-3 - 为什么 @Html.HiddenFor 设置指定以外的其他模型属性的值?

asp.net-mvc - 主流搜索引擎无法抓取 MVC 站点?

c# - .NET MVC3 首选模型初始化

c# - MVC 3 DropDownFor 和 ViewModel 不工作

c# - 数据存储在哪里?

c# - 使用匿名对象创建列表

entity-framework - MapSingleType 错误

c# - 在哪里放置授权方法?

asp.net-mvc-3 - Razor -如何将内容渲染为变量

jquery - 更改用于验证的 jQuery 自定义样式,使其显示为工具提示