2011-04-22 55 views
4

我先使用EF 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; 
} 

我想确保延迟加载这里不涉及。

我遇到的问题是,如果没有医院属性上的virtual关键字,当我检索到有医院相关的医生时,该集合是空的。 通过包含virtual关键字,医院收集确实包含1项,这是我所期望的。

问题是,当我想要创建一位全新的医生并立即将他与医院联系起来时,由于医院属性尚未初始化,我得到了一个异常情况Null reference

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

干杯。 Jas。

回答

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,则必须自己处理初始化。

+0

伟大的东西,工作。干杯。 – 2011-04-22 13:32:23

+0

每当我看到您的帖子之一,它解决了我的问题。如果你有一本关于EF的书,我会买它! – GraemeMiller 2011-12-09 13:28:26

+0

感谢您的解决方案。也为我工作。 – OSH 2012-09-20 11:29:21

1

我认为这可以帮助你。

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

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

是的,最终,我就是这么做的 - 在ctor中创建新的实例。 – 2013-08-22 14:51:00

+1

我们可以为ICollection创建实例???(接口) – ManirajSS 2015-05-13 14:15:20