2013-09-07 2 views
1

У меня есть эти объекты:EntityFramework Не Загрузка Связанные данные

public class Company : PrimaryKey 
{ 
    public string Name {get;set;} 

    public virtual Account Account {get;set;} 
} 

public class Account 
{ 
    [Key] 
    public Guid CompanyId { get; set; } 

    public virtual Company Company {get;set;} 
} 

я использую следующие конфигурации:

modelBuilder.Entity<Company>() 
    .HasOptional(c => c.Account) 
    .WithRequired(a => a.Company) 
    .WillCascadeOnDelete(); 

Теперь у меня есть два проекта, один испытательный стенд проект, который является Console Application с a DbContext и Repository, второй - проект полной продувки, который является MVC 4, в котором я использую Dependancy Injection, чтобы создать репозиторий .InTransientScope(), который, в свою очередь, загружает новый con текст каждый раз, когда он вызывается.

Оба имеют точно такие же контексты и репозитории (продукт, очевидно, имеет интерфейсы).

в испытательном стенде, когда я называю это:

_repository.GetById<Company>(id); 

Всего этих свойства заполняются, т.е. жадной загрузки

в производстве, когда я называю ту же линию, ничего не загружаются и его не загружается, пока я создал еще одну функцию, которая делает это:

_dbContext.Companies.Include("Account").FirstOrDefault(x => x.Id.Equals(id)); 

из которых при выполнении действительно обеспечивает всю Account информацию, но е неявно заблокировать любые другие навигационные свойства, которые содержит Account !!! Несмотря на то, что я отключил LazyLoading, он все равно не работает.

Это удивительно, потому что оба проекта принципиально одинаковы, бар использование IoC DI в одном из них ....

Почему это происходит? Как я могу указать в основном общем хранилище, чтобы он мог загрузить всю эту информацию в предпочтении Controllers ....?

Перерыв Очки

Я поставил точки разрыва в обеих проектах тоже смотрит на ADO.NET обращения к базе данных и оператору SQL, который был выполнен в испытательном стенде она погаснет, и вызов информации, в производстве у нее не было никаких объединений или чего-либо подобного, что так было.

Другие вещи Пробовал

Я пытался доступ к навигации свойство непосредственно при загрузке из базы данных:

var acc = _repository.GetById<Company>(id).Account; 

Он по-прежнему говорит null. Таким образом, мой репозиторий/контекст даже не загружает какие-либо связанные данные, когда его просят ... что происходит ?!

Определения

_repository.GetById<Company>(id); 

является:

public T GetById<T>(Guid id) 
{ 
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id.Equals(id)); 
} 
+0

Можете ли вы показать, как реализован '_repository.GetById'? Ложная загрузка отключена? (Меня смущает предложение «* Даже если я отключил LazyLoading, он все равно не работает *» - как если бы вы ожидали, что отключение ленивой загрузки может улучшить что-нибудь ...) – Slauma

+0

Я предполагаю, что, отключив ленивую загрузку будет означать, что он будет использовать нетерпеливую загрузку .... @Slauma –

+1

Отключение ленивой загрузки означает, что никакое свойство навигации не будет загружено вообще. Нежелательная загрузка действительно применяет 'Include (...)' явно. Это никогда не происходит автоматически. – Slauma

ответ

0

Он сейчас работает, я понятия не имею, почему .. я не подделаны ни с чем. Единственное, что у меня есть, было положить .InTransientScope() на IDbContextFactory<MyContext>

Я на самом деле все включено отложенной загрузки везде, где я мог, и теперь он работает .... но это странно, что, когда я приступил к проекту производства я даже не подделаны с Lazy Loading на всех, но так как я расширил Model и добавил modelBuilder вещи, которые мне пришлось конкретно сказать Lazy Load.

Смежные вопросы