2012-05-10 3 views
1

Я сделал все чтения, которые я могу найти на Entity и ленивой загрузке, а также другие вопросы здесь, но для жизни меня я не могу заставить эту работу работать. Вот мой SQL для БД:C# Entity Framework Lazy Loading Is not Loading

CREATE TABLE corporations(
corporationID bigint PRIMARY KEY 
); 

CREATE TABLE Character(
personID bigint PRIMARY KEY, 
corporationID int NOT NULL, 
FOREIGN KEY (corporationID) REFERENCES corporations(corporationID) 
); 

И код Entity, чтобы получить его (* EDITED от оригинала, все еще сломана *):

DBEntities context = new DBEntities(); 
public Character Character_GetByID(long CharacterID) 
     { 
      context.ContextOptions.LazyLoadingEnabled = true; 
      Character character = context.Characters.Where(c => c.CharacterID == CharacterID).FirstOrDefault();  
      return character; 
     } 

Так от моего понимания, с этим Я должен уметь

Character char = Character_GetByID(characterID); 
Corporation corp = char.Corporation; 

Объект «char.Corporation» существует, Entity создала его должным образом из eign. Но когда я запускаю вышеуказанный код, «corp» всегда возвращается как NULL (хотя я точно знаю, что соответствующая корпорация находится в БД).

Одна вещь, которую я действительно замечал, что в автоматически генерируемой Entity объекта Персонажа, он имеет функцию:

public virtual Corporation Corporation 
     { 
      get { return _corporation; } 
      set 
      { 
       if (!ReferenceEquals(_corporation, value)) 
       { 
        var previousValue = _corporation; 
        _corporation = value; 
        FixupCorporation(previousValue); 
       } 
      } 
     } 

Что кажется странным, потому что я предположил бы, что с отложенной загрузки функция «получить» будет что-то вроде «если null, попробуйте получить Корпорации из базы данных». Любые мысли будут высоко оценены.

* EDIT * Запрос как отложенной загрузки настраивается:

В моем классе Context для каждого конструктора У меня есть

this.ContextOptions.LazyLoadingEnabled = true; 

И как вы можете видеть из первого C# выше, я попытался установить его как истину в самой функции непосредственно перед ее запросом.

+0

Могли бы вы вставить как вы настроили отложенную загрузку? – ivowiblo

+0

использовать .Include (x => x.Corporation); – Greens

+0

@ivowiblo: Я добавил редактирование, чтобы показать, что я сделал с конфигурацией LazyLoading, но если есть какая-то конфигурация, я полагаю, что я не знаю об этом – Jordan

ответ

3

Ленивая загрузка функционал обеспечивается контекстом объекта (например DBEntities класса в вашем случае). Таким образом, он будет работать только тогда, когда объект объекта привязан к некоторому экземпляру DBEntities. Когда метод Character_GetByID выполняется, контекст удаляется, объект отделяется, и ваш ленивый запрос на загрузку не может быть выполнен.

+0

Итак, я пошел дальше и избавился от «использования (var context = new DBEntities())» и заменил его, установив приватную переменную во всем классе (поэтому он не удаляется при выходе метода). К сожалению, он все еще не работает, хотя ... – Jordan

+0

Все исправлено! Контекст все еще был настроен каким-то образом, хотя он работал. Спасибо за помощь! – Jordan

+0

Но вы все равно убираете свой контекст где-то, верно? Потому что у вас будет плохое время, если нет. –

0

использовать .Include (x => x.Corporation);

Для получения информации о загрузке соответствующих данных.

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

Да, я пробовал это, и это сработало, но это плохое решение, потому что я не хочу, чтобы он ВСЕГДА содержал эти данные (причина в том, что это всего лишь один пример многих объектов Entity , ни одна из которых не работает, а некоторые из них имеют очень большие наборы данных, которые я не хочу всегда загружать, потому что они редко используются) – Jordan

+0

@ Зеленые, это нетерпеливая загрузка, а не лени. – Dennis

1

Снимите с помощью заявления, так как при использовании этого DbContext расположен сразу

using (var context = new DBEntities()) 
{ 
    ... 
}//context is disposed here... lazy loading is not possible