asp.net mvc ObjectDisposedException с ef - PullRequest
3 голосов
/ 27 июля 2011

Мне нужна помощь с этой ошибкой "Экземпляр 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>

Контроллер:

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

ProvinceService:

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

Я знаю, что проблема возникает во втором раскрывающемся списке, когда он пытается извлечь данные, когда соединение прерывается предыдущим запросом.Пожалуйста, помогите мне с этим, спасибо.

Ответы [ 3 ]

6 голосов
/ 27 июля 2011

Исправить несложно - перед использованием конвертировать в .ToList () или First (). LINQ отложил выполнение и пытается выполнить эту команду после удаления контекста (когда на результаты вашего объекта ссылаются), а не когда вы на самом деле делаете вызов. Вы должны заставить его запускать сейчас , пока контекст находится в области действия.

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

Кроме того - ваш код выше проверяет нулевое значение в методе доступа get. Однако этот объект не будет нулевым - он будет удален, поэтому вы не можете выполнить эту проверку таким образом, вам нужно проверить, является ли он нулевым и не уничтожен.


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

что-то подобное в любом случае:)

0 голосов
/ 03 июня 2014

Вот проблема, когда вы используете

using(var context=new CustomerContext())
{

     return View(context.Customers.ToList());
}

, когда блок кода выполняет, все ссылки располагаются так, что вы загружаетесь медленно, поэтому выдает эту ошибку.поэтому я использовал

return View (context.Customers.ToList ()) напрямую, он будет прекрасно работать.

0 голосов
/ 26 апреля 2012

Я столкнулся с подобной проблемой. Я следовал этому шаблону, который я видел во многих примерах кода в Интернете:

public ActionResult Show(int id)
{
   using (var db = new MyDbContext())
   {
      var thing = db.Things.Find(id);
      return View(thing);
   }
}

Однако это вызывало исключение ObjectDisposedException, указанное выше, всякий раз, когда я пытался получить доступ к чему-либо, что не было загружено в память в коде представления (в частности, отношения один ко многим в модели основного представления).

Я нашел другой шаблон в этом примере :

public class MyController : Controller
{
   private MyDbContext _db;

   public MyController()
   {
      _db = new MyDbContext();
   }

   public ActionResult Show(int id)
   {
      // Do work such as...
      var thing = _db.Things.Find(id);
      return View(thing);
   }

   protected override void Dispose(bool disposing)
   {
      _db.Dispose();
      base.Dispose(disposing);
   }
}

Этот шаблон поддерживает соединение с базой данных до тех пор, пока представление не завершит рендеринг, и аккуратно удаляет его при удалении самого контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...