Ошибка при отображении деталей (экземпляр ObjectContext был удален) - PullRequest
3 голосов
/ 11 мая 2011

Я создаю приложение ASP.NET MVC 3, и у меня есть модель, которая выглядит примерно так:

public partial class Flavor
{
   // ...
   public string Name { get; set; }
   public bool HasNuts {get; set; }
   public virtual ICollection<SaleData> Sales {get; set;}
   // ...
}

, которая извлекает некоторые данные из БД как таковые:

public PartialViewResult Details(int id)
{
   using (var db = new IceCreamDBFlavors())
   {
      Flavor someFlavor = db.Flavors.Find(id);
      someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
      return PartialView("details", someFlavor);      
   }
}

на представлении я делаю что-то вроде этого:

<fieldset>
   <legend>Sales Data</legend>
   @foreach (var sale in Model.Sales)
   {
      <div>Weekly</div>
      <div>@sale.Weekly</div>
   }
</fieldset>

Если я не получаю данные продаж, мои данные вкуса отображаются нормально, без ошибок, но при добавлении вызова для получениясписок данных о продажах приводит к ошибке "Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения." * Произошло .

Я прочитал несколько другихпосты об этом и думаю, я что-то здесь упускаю.Я полагаю, что эта ошибка происходит из-за отложенной загрузки, по крайней мере, на основании того, что я читал здесь и в других местах.Установка точки останова в контроллере перед возвратом PartialView и проверка объекта, я полагаю, приводит к выполнению оценки, поэтому все отображается так, как я хотел бы.

У меня сложилось впечатление, что вызов ToList()приведет к заполнению коллекции Sales. Поскольку у меня нет проблемы, когда эта строка закомментирована, я предполагаю, что проблема все еще связана с этим, и когда представление пытается выполнить итерации Sales, это невозможно.Я прав здесь?Я думаю, я думал Я заставлял оценку.Как мне решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Я подозреваю, что у Flavor есть другие коллекции (и не только Sales), и это на самом деле во время доступа к тем, которые он ломает.

Здесь вы заменяете только Sales, в то время как другим коллекциям или сложным свойствам по-прежнему нужен контекст объекта.

0 голосов
/ 11 мая 2011

Не располагайте класс IceCreamDBFlavors, который наследуется от ObjectContext, он должен иметь время жизни больше, чем разрешено в настоящее время.

Изменить

using (var db = new IceCreamDBFlavors())
{
  Flavor someFlavor = db.Flavors.Find(id);
  someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
  return PartialView("details", someFlavor);      
}

На

try
{
    var db = new IceCreamDBFlavors();

    Flavor someFlavor = db.Flavors.Find(id);
    someFlavor.Sales = db.Sales.Where(c => c.FlavorID == id).ToList();
    return PartialView("details", someFlavor);    
}
catch(Exception ex)
{
    // log exeption
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...