2012-01-12 90 views
0

我想我遇到了一個錯誤,看起來EF在刪除並重新插入實體後沒有很好地處理引用。我已經成功與下面的代碼重現它(假設所有的斷言通過,除了一個我在評論中討論):

引用保留爲空

var database = new TestEntities(); 

// select and delete the info record 
var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 
// when i uncomment the line below the last Assert fails 
// Assert.IsNotNull(info.Member); 
database.Info.Remove(info); 

// add it again and persist it to the database 
database.Info.Add(new Info { 
    ID = 1, 
    MemberID = 1 
}); 
database.SaveChanges(); 

// should not be null ? EDIT: i guess i understand this becoming null 
Assert.IsNull(info.Member); 

// and even here its still null 
info = database.Info.First(i => i.ID == 1); 
Assert.IsNull(info.Member); 


誰能告訴我什麼是怎麼回事?

編輯: 我的實體首先使用數據庫生成,然後使用DbContext/POCO生成器來生成。

public partial class Member 
{ 
    public Member() 
    { 
     this.Info = new HashSet<Info>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Info> Info { get; set; } 
} 

public partial class Info 
{ 
    public int ID { get; set; } 
    public int MemberID { get; set; } 

    public virtual Member Member { get; set; } 
} 
+0

嘗試關閉延遲加載。 – cadrell0 2012-01-12 21:32:11

+0

您的實體如何定義?先編碼?從數據庫生成? – 2012-01-12 21:34:08

+0

@ cadrell0 - 我怕這不是一個選項,因爲我需要延遲加載。 – Fabian 2012-01-12 21:52:59

回答

1

事實證明,它與刪除和重新插入無關,而不是真的。它是那麼明顯......

我使用未即時加載,沒有任何延遲加載功能的POCO插入...

我第二次查詢了我期待相同的記錄一個代理,但似乎POCO被EF緩存,這就是它返回的意思,仍然沒有急切或懶惰的加載。

我可以通過確保EF無法從緩存中檢索第二個查詢,使用代理(var info = database.Info.Create())插入或在查詢中包含成員(database.Info.Include(i => i.Member).First(i => i == 1))來解決此問題。

0

鑑於這種

var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 

你不是比較info.ID這裏info.MemberID? ID和MemberID實際上不一樣嗎?

而且,你不應該

database.Info.Remove(info); 

後使用.SaveChanges()?

此外,info沒有.member可用,如果沒有實例化。 MemberID是否與info.MemberId相關聯?

+0

我明白這個混淆,會員也有ID 1(並且是成員存在於數據庫中)。關於'.Remove()'後的'.SaveChanges()',那不幸的是沒有任何區別。 – Fabian 2012-01-12 22:44:27