Подтвердить что ты не робот

Экземпляр объекта 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

Пожалуйста, помогите.

4b9b3361

Ответ 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;
}