EF 4.1 - добавление элементов в виртуальное свойство коллекции - PullRequest
4 голосов
/ 22 апреля 2011

Сначала я использую код EF 4.1.Учитывая следующий фрагмент класса:

public class Doctor
{
    public virtual ICollection<Hospital> Hospitals { get; set; }
}

Примечание: у меня это в контексте базы данных:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    this.Configuration.LazyLoadingEnabled = false;
}

Я хотел убедиться, что отложенная загрузка здесь не задействована.

Проблема, с которой я столкнулся, заключается в том, что без ключевого слова virtual в собственности больницы, когда я получаю врача, с которым связана больница, коллекция пуста.Включая ключевое слово virtual, коллекция больниц содержит 1 элемент, чего я и ожидаю.

Проблема в том, что, когда я хочу создать нового доктора и немедленно связать его с больницей,Я получаю исключение Null reference, поскольку свойство Больницы еще не было инициализировано.

Может кто-то указать, что я здесь не так делаю?Как я могу добавить предметы в больницы при создании нового доктора.

Приветствия.Иак.

Ответы [ 2 ]

22 голосов
/ 22 апреля 2011

Ваш код - это то, что вы обычно видите во всех примерах, но чтобы сделать эту работу, этот гораздо лучше:

public class Doctor
{
    private ICollection<Hospital> _hospitals;
    public virtual ICollection<Hospital> Hospitals 
    { 
        get { return _hospitals ?? (_hospitals = new HashSet<Hospital>()); }
        set { _hospitals = value } 
    }
}

Если вы не используете virtual, ключевое слово EF не будет инициализировать коллекцию длявы.В то же время, если вы создаете новый Doctor через его конструктор, вы должны сами выполнить инициализацию.

1 голос
/ 22 августа 2013

Я думаю, что это может вам помочь.

public class Doctor
{
    public Doctor()
    {
       Hospitals = new ICollection<Hospital>();
    }

    public virtual ICollection<Hospital> Hospitals { get; set; }
}
...