EF 4.1 - 将项添加到虚拟的集合属性

时间:2011-04-22 13:12:41

标签: ef-code-first entity-framework-4.1

我首先使用EF 4.1代码。给出以下类片段:

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

注意:我在数据库上下文中有这个:

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

我想确保此处不涉及延迟加载。

我遇到的问题是,如果没有Hospitals属性上的virtual关键字,当我找回一家医院与他有关联的医生时,该收集是空的。 通过包含virtual关键字,医院集合确实包含1个项目,这正是我所期望的。

问题在于,当我想创建一位全新的医生并立即将他与医院联系时,我得到Null reference例外,因为医院的财产尚未初始化。

有人能指出我在这里做错了什么吗?如何在创建新医生时向医院添加项目。

干杯。 雅各

2 个答案:

答案 0 :(得分:22)

您的代码是您在所有示例中通常看到的内容,但为了使这项工作更好:

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 :(得分:1)

我认为这可以帮到你。

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

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