Включить перед присоединением Не работает Entity Framework 6

В проекте MVC4 я использую включение в запрос LINQ:

> var tests = from ct in context.CourseTest.Include("Test")  join uc in
> context.UserCourse on ct.CourseID equals uc.CourseID select ct;

В CourseTest есть тестовый объект

Это работает внутри «использующего контекста»

но однажды вернулся к контроллеру, используя:

вернуть тесты.ToList();

в

UserCourse.Test удаляется:

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

Раньше это работало нормально в более старой версии (не уверен, что я тестировал это с соединением).

Как я могу заставить его придерживаться..?


person Dani    schedule 21.12.2013    source источник


Ответы (2)


Иногда предложение include игнорируется. У меня не все в голове, но объединение, группировка и проецирование объектов заставят EF игнорировать включения.

В вашем примере, если вы сделаете:

var Tests = from ct in context.CourseTest join uc in context.UserCourse on ct.CourseID equals uc.CourseID select ct; 
return Tests.Include("Test").ToList();

Это будет работать, потому что включение не переопределяется проекцией, группировкой или предложением присоединения.

Просто другие вещи:

1/Ваше предложение о присоединении действительно полезно? (только в том случае, если вы хотите, чтобы тест курса, у muse был пользовательский курс.)

2/ для вашего расположенного контекста, это потому, что ваш DbContext использует ленивую загрузку. Ваше предложение include игнорируется, но с отложенной загрузкой вместо null свойство тестовой навигации содержит прокси (т.е. не равно null). Поэтому, когда вы обращаетесь к своему свойству навигации, прокси-сервер видит, что реальные данные не загружены, и выполняет запрос для получения тестовых данных. Ваш контекст расположен, поэтому у вас есть исключение.

EF генерирует запрос, но выполняет запрос только при повторении результата (в цикле foreach или с помощью ToList(), ToArray(), ToDictionary(),...). Поэтому, если вы используете уровень доступа к данным с использованием предложения using для вашего контекста , всегда обязательно повторяйте свой результат, чтобы заставить EF выполнить запрос (например, с помощью ToList()).

person Nicolas    schedule 17.04.2014

Возможно, вы могли бы использовать реализацию контекста Singleton. Тогда он не должен быть удален (но имеет другие недостатки, например: только один контекст, который не удаляется).

person Oliver Müller    schedule 07.01.2014
comment
одноэлементные контексты опасны!! у него есть проблемы с параллелизмом. - person sotn; 30.01.2015