DbContext не создает экземпляр свойства навигации

Я создал два объекта с простым отношением 1 ко многим.

public class TestEntity
{
    public int Id { get; set; }
    public string Message { get; set; }

    public virtual ICollection<RelatedTest> RelatedTests { get; set; }
}

public class RelatedTest
{
    public int Id { get; set; }
    public bool Something { get; set; }

    public virtual TestEntity TestEntity { get; set; }
}

Когда я иду, чтобы проверить это, свойство навигации ICollection не создается. Я не могу добавить связанный объект.

var dataContext = new DataContext();
var testEntity = new TestEntity { Message = "Test message" };
var related = new RelatedTest { Something = true };
testEntity.RelatedTests.Add(related); //fails on this line because RelatedTests is null.
dataContext.TestEntities.Add(testEntity);
dataContext.SaveChanges();

Это ожидаемая функциональность? Нужно ли создавать экземпляр свойства навигации? Я ожидал, что Entity Framework создаст для меня экземпляр коллекции.


person Chev    schedule 30.09.2012    source источник


Ответы (2)


В приведенном выше примере вы, вероятно, хотите что-то более похожее на

var dataContext = new DataContext();
var testEntity = new TestEntity { Message = "Test message" };
var related = new RelatedTest { Something = true };
testEntity.RelatedTests = new List<RelatedTest>{related};
dataContext.TestEntities.Add(testEntity);
dataContext.SaveChanges();

поскольку вы создаете базовый объект, поэтому EF еще не получил доступ к объекту для каких-либо исправлений.

Когда вы перезагружаете этот объект из базы данных, коллекция не должна быть нулевой в приведенном выше примере, поскольку вы, похоже, используете отложенную загрузку.

person Not loved    schedule 30.09.2012
comment
Почему бы просто не переопределить установщик объекта и не инициализировать его там, что избавляет от необходимости писать инициализацию более одного раза. - person David van Dugteren; 22.03.2014

Что ж, инфраструктура сущностей не «инициализирует» какие-либо из ваших объектов (кроме данных, УЖЕ В БАЗЕ ДАННЫХ). Вы должны сделать это самостоятельно. EF только «сопоставляет его с базой данных».

person Sidharth Mudgal    schedule 30.09.2012
comment
Таким образом, он будет создавать экземпляр коллекции свойств навигации только в том случае, если он получен из DbContext и уже имеет связанные объекты? - person Chev; 30.09.2012
comment
Я чувствую, что вам нужен конструктор для класса, который «инициализирует» ваш объект. - person Sidharth Mudgal; 30.09.2012
comment
Не совсем правильно, Алекс, ему уже не нужны связанные объекты - он должен быть инициализирован пустой коллекцией, если она загружена из базы данных и нет связанных объектов. - person Nathan Phillips; 21.01.2013