При использовании 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?