2011-04-22 50 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