Экземпляр объекта ObjectContext был удален и больше не может использоваться для операций, требующих подключения. в справочной таблице
У меня есть две таблицы Клиенты и Страна и используют (Entity Framework с vs 2012)
![enter image description here]()
И класс модели
using System;
using System.Collections.Generic;
public partial class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public Nullable<int> CountrryId { get; set; }
public string Note { get; set; }
public virtual Country Country { get; set; }
}
Я пытаюсь создать запрос выбора для получения всех клиентов с именем страны. Но я всегда получаю следующее сообщение об ошибке.
![enter image description here]()
Пожалуйста, помогите.
Ответы
Ответ 1
Вы пытаетесь получить доступ к свойству ассоциации Country
после того, как контекст данных был удален. Entity Framework по умолчанию ленивы загружает свойства ассоциации. Другими словами, он совершает другое путешествие к базе данных, когда вы впервые пытаетесь получить доступ к свойству ассоциации. Чтобы выполнить эту поездку в базу данных, Entity Framework должен использовать контекст данных. В вашем случае он попытается использовать контекст данных, созданный jQGridDemoEntities db = new jQGridDemoEntities()
, который, к сожалению, был удален в этот момент вашего кода. Контекст данных был удален из-за того, что вы вышли из с помощью блока.
У вас есть три варианта решения этой проблемы:
-
Доступ к свойству ассоциации, когда контекст данных все еще жив. Более конкретно, переместите свой код, когда вы получаете доступ к свойству ассоциации в свой блок
-
С нетерпением загрузите свойство ассоциации, как описано в первой ссылке, указанной мной
customers = db.Customers.Include(c => c.Country).ToList()
-
Явным образом выберите то, что вы хотите вернуть из базы данных, пока контекст данных все еще жив. И используйте эту информацию, чтобы построить объект json для вашего возвращения.
customers = db.Customers.Select(c => new
{
c.Id,
c.FirstName,
c.LastName,
c.Address,
c.Email,
c.Phone,
CountryName = c.Country.Name,
c.Note
};
Ответ 2
У вас включена ленивая загрузка. Поэтому, когда вы пытаетесь загрузить ссылочное свойство, нет способа сделать это, потому что ObjectContext расположен сразу после блока using
.
Есть два способа исправить это:
//1. Tell EF to load Country property immediately.
using(var db = new jQGridEntities())
{
customers = db.Customers.Include(c => c.Country).ToList();
}
//2. Put return inside using block.
using(var db = new jQGridEntities())
{
customers = db.Customers.ToList();
return Json(/*your code*/);
}
Также вы можете отключить ленивую загрузку, но в этом случае вы получите NullReferenceException
, который также может быть исправлен с помощью .Include(c => c.Country)
.
Ответ 3
Вы удаляете базу данных с помощью using
block
Поместите свой код в блок using
не снаружи.
При использовании элемента блока using
, который в using(var element)
находится при использовании концов блока
Ответ 4
есть еще одно решение, используя ViewBag
using(var db = new jQGridEntities())
{
var customers = db.Customers.Where(c=>c.Country!=null).ToList();
ViewBag.customerlist= customers;
}