У меня есть эти объекты: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));
}
Можете ли вы показать, как реализован '_repository.GetById'? Ложная загрузка отключена? (Меня смущает предложение «* Даже если я отключил LazyLoading, он все равно не работает *» - как если бы вы ожидали, что отключение ленивой загрузки может улучшить что-нибудь ...) – Slauma
Я предполагаю, что, отключив ленивую загрузку будет означать, что он будет использовать нетерпеливую загрузку .... @Slauma –
Отключение ленивой загрузки означает, что никакое свойство навигации не будет загружено вообще. Нежелательная загрузка действительно применяет 'Include (...)' явно. Это никогда не происходит автоматически. – Slauma