2015-03-28 4 views
4

У меня есть две моделиПочему навигационная способность иногда возвращает null?

public class Indicator 
{ 
    public long IndicatorID { get; set; } 
    public string Name { get; set; } 
    public int MaxPoint { get; set; } 
    public string Comment { get; set; } 
    public DateTime DateChanged { get; set; } 
    public DateTime DateCreated { get; set; } 

    public virtual IList<CalculationType> CalculationTypes { get; set; } 
} 

public class CalculationType 
{ 
    public long CalculationTypeID { get; set; } 
    public string UnitName { get; set; } 
    public int Point { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateChanged { get; set; } 

    public virtual Indicator Indicator { get; set; } 
} 

У меня есть базы данных завода

public class DatabaseFactory 
{ 
    private StankinQuestionnaireEntities dataContext; 
    public StankinQuestionnaireEntities Get() 
    { 
     return dataContext ?? (dataContext = new StankinQuestionnaireEntities()); 
    } 
} 

и имущество, которое относится к databaseFactory

protected StankinQuestionnaireEntities DataContext 
{ 
    get { return dataContext ?? (dataContext = DatabaseFactory.Get()); } 
} 

Я использую Autofac и РЕГИСТРИРУЙСЯ DatabaseFactory

builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerRequest(); 

на моем хранилище я пытаюсь данные получить от свойства навигации двумя способами

enter image description here

первая линия работает отлично (CalculationType содержит один элемент)

enter image description here

но вторая возвратная линия нуль на имущество Расчетный тип

enter image description here

Почему?

UPDATE Я обнаружил, что если удалить строку «.InstancePerRequest()», все будет работать. Но мне это не подходит.

UPDATE2 по какой-то причине, эф не создал прокси класс

+0

В первом случае у вас есть прокси (см. Его тип исполнения). Во втором случае у вас есть базовый тип модели. Поведение свойств навигации, которое вы ожидаете, работает только на прокси-серверах, поскольку прокси-серверы - это подтипы вашего базового типа модели, которые переопределяют ваши свойства навигации, чтобы обеспечить легкую и ленивую загрузку. Если прокси не существует, структура не будет иметь возможности переопределить свойство навигации и дать вам поведение, которое вы хотите. –

+0

@ TheodorosChatzigiannakis, но почему ef не создал прокси-класс? ProxyEnable set true http://savepic.net/6498011.png – kriper

ответ

1

Вы, безусловно, имеют разные значения ProxyCreationEnabled собственности для контекста базы данных.

Если вы посмотрите на типы выбранных объектов на скриншотах, вы увидите, что первый имеет тип System.Data.Entity.DynamicProxies.Indicator_E ..., а второй имеет тип StankinQuestionnaire.Model.Indicator ,

Это означает, что ProxyCreationEnabled является истинным для первого контекста базы данных, а свойство является ложным для второго. Таким образом, ленивая загрузка не работает во втором случае.

Попробуйте найти, где ProxyCreationEnabled установлен в вашем проекте, возможно, у вас есть несколько мест для этого.

+0

К сожалению, они установлены в true http://savepic.net/6498011.png – kriper

+0

Но да по какой-то причине не создается прокси-класс. – kriper

+0

Ну, я скачал ваш проект. Я получаю ссылку от вашего другого вопроса. Затем я поместил код для запроса индикатора по идентификатору в 'UpdateIndicator' метод' CalculationTypeRepository' и вызвал его из 'Home'-контроллера. Без вопросов. Прокси создается для обоих объектов. [Скриншот] (http://savepic.net/6489835.png). Итак, я все еще думаю, что вы отключите создание прокси-сервера где-то в своем новом коде. –

0

Попробуйте это:

DbContext.Configuration.ProxyCreationEnabled = true;  
DbContext.Configuration.LazyLoadingEnabled = true; 

Если DbContext.Configuration.ProxyCreationEnabled установлен в ложь, DbContext не будет загружать дочерние объекты для некоторого родителя объект, если для родительского объекта вызывается метод Include. Установка DbContext.Configuration.LazyLoadingEnabled на true или false не повлияет на его поведение.

Если для параметра DbContext.Configuration.ProxyCreationEnabled установлено значение true, дочерние объекты будут загружаться автоматически, а значение DbContext.Configuration.LazyLoadingEnabled будет контролироваться при загрузке дочерних объектов.

Я думаю, что этот пост одно и то же это: Why EF navigation property return null?

+0

Я спросил об этом http://stackoverflow.com/questions/29272581/why-ef-navigation-property-return-null/29272906#29272906 :) Я обнаружил, что если удалить строку «.InstancePerRequest()», все работает. Но мне это не подходит. – kriper

+0

@kriper Похоже, что контекст расположен во время отладки. Возможно, вы можете переопределить метод 'Dispose' в контексте и установить точку останова в дюймах. –

+0

@GertArnold в распоряжении, свойство навигации тоже не равно http://savepic.net/6536837.png – kriper

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