EF4 Eager Загрузка через базовый экземпляр ObjectContext - PullRequest
1 голос
/ 20 апреля 2011

При использовании ORM я обычно создаю фабричный метод для возврата экземпляра DataContext / ObjectContext, который я затем буду использовать для запроса источника данных. Обычно мои фабрики возвращают базовый контекстный класс; поэтому в случае EF4 я возвращаю экземпляр типа ObjectContext, а не сгенерированный экземпляр «MyDBConext». Подпись метода выглядит примерно так:

ObjectContext CreateContext()

Этот метод CreateContext возвращает экземпляр с параметрами LazyLoadingEnabled = false и ProxyCreationEnabled = false. При доступе к коллекциям сущностей я бы назвал что-то вроде ctx.CreateObjectSet (), где T, конечно, является типом сущности.

Я заметил, что когда я использую экземпляр типа ObjectContext, а не «MyDBConext», нетерпеливая загрузка не работает.

User result = null;
using(ObjectContext ctx = ContextFactory.CreateContext()) {
              ObjectSet<User> userSet = ctx.CreateObjectSet<User>();
               //userSet.Include(x => x.Roles);
               userSet.Include("Roles");
               result = userSet.SingleOrDefault(exp);                
      }
      return result;

Но изменив оператор использования на что-то вроде

 using(MyDBConext ctx = new MyDBConext()) {

работает как положено. Но почему? Могу ли я не пытаться загрузить через базовый экземпляр ObjectContext?

1 Ответ

0 голосов
/ 20 апреля 2011

Вот как я решил свою проблему

User result = null;
using(ObjectContext ctx = ContextFactory.CreateContext()) {
    ObjectSet<User> userSet = ctx.CreateObjectSet<User>();              
    result = userSet.Include("Roles").SingleOrDefault(exp);                
 }
 return result;

Я подумал, что оператор include изменил текущий экземпляр ObjectSet / ObjectQuery и вернул его.Я думал, вот как большинство беглых API были разработаны для работы.Поместив строку «Включить» и связав вызовы методов, вы получили результаты запроса, как и ожидалось.Это интересный «факт» о плавном API EF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...