Kaishu Kawde Ответов: 1

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


public ActionResult Edit(string serviceTypeId)
{
      using (SolutionsEntities css = new SolutionsEntities())
     {
          ServiceOffering obj = 
                            css.ServiceOfferings.Find(Convert.ToInt32(serviceTypeId));                
           TempData["ServiceTypeId"] = obj;
           return Json(obj, JsonRequestBehavior.AllowGet);
     }
     return RedirectToAction("ServiceTypes");
}



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

Что я уже пробовал:

Когда я добавил точку отладчика рядом с функцией Find of EF и wail до тех пор, пока не придет результат, тогда только она работает так, как ожидалось, но при запуске без добавления точки отладчика она выбрасывает вышеупомянутую ошибку

Richard Deeming

Почему у тебя есть недостижимое return в конце вашего метода?

Почему вы храните объект внутри TempData?

Это звучит как проблема ленивой загрузки; но не в коде, который вы опубликовали.

Kaishu Kawde

Нам нужны детали этого объекта позже, поэтому нам нужно сохранить их в TempData.

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Вам нужно почитать о Entity Framework и "отложенном выполнении".

У вас есть два оператора return, но только один из них когда-либо выполняется, тот, который находится внутри блока "using".

Оператор return может возвращать один объект,но он не возвращает никаких связанных с ним объектов. Если у вас есть свойства навигации в классе ServiceOffering, объекты в этих свойствах не возвращаются с этим запросом. Поэтому, когда вы идете использовать их, EF нужно снова запросить базу данных, чтобы получить их. Но, поскольку этот код находится в блоке "using", контекст (Solutions) уже удален и больше не может использоваться.

Вы должны сказать EF, чтобы он вернул объекты свойств навигации вместе с объектом, который вы запрашиваете. Вот что такое .Расширение Include () предназначено для.

public ActionResult Edit(string serviceTypeId)
{
    // You should probably validate that you even have a serviceTypeId here...

    int idToFind;
    if (int.TryParse(serviceTypeId, ref idToFind))
    {
        using (SolutionsEntities css = new SolutionsEntities())
        {
            ServiceOffering obj = css.ServiceOffering.Include(x => x.relatedProperty).SingleOrDefault(x => x.Id == idToFind);
            if (obj == null)
            {
                // Do something if the id doesn't exist...
            }
            else
            {
                return obj;
            }
        }
    }
}


Kaishu Kawde

публичное предложение услуг частичного класса
{
общественные ServiceOffering()
{
этот.ServiceProviderServiceRates = новый HashSet & lt;serviceproviderservicerate>();
этот.ServiceProviderServiceofferings = новый HashSet & lt;serviceproviderserviceoffering>();
}

public int ServiceId { get; set; }
общественного строка описание servicedescription { получить; набор; }
общественного значения null&ЛТ;типа bool и GT; IsDeleted { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; CreatedOn { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; Поиск { получить; набор; }

общедоступный виртуальный интерфейс ICollection&ЛТ;serviceproviderservicerate&ГТ; ServiceProviderServiceRates { получить; набор; }
общедоступный виртуальный интерфейс ICollection&ЛТ;serviceproviderserviceoffering&ГТ; ServiceProviderServiceofferings { получить; набор; }
}

Это класс, созданный EF. В соответствии с этим, как мне нужно с этим справиться?

Dave Kreskowiak

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