2011-06-01 98 views
2

與EF4工作,模型第一種方法在VS 2010中:實體框架外鍵的跟蹤引起問題

考慮以下EntityModel:

「OrderBase」是隻用一個「名稱」屬性

抽象實體

「Detail」(有一個屬性「Text」)是一個與OrderBase具有多對一關聯的實體(即一個OrderBase有多個Details)

「Comment」(with one property「Text」)是一個具有多對一關聯的實體到「OrderBase」(即一個OrderBase具有多個評論)

「MusicOrder」是從「OrderBase」只用一個屬性「數量」(int)的衍生的實體

「SongOrder」是從「OrderBase」只用一個屬性導出的實體「長度」(int)。 SongOrder與MusicOrder具有多對一的關係(即一個MusicOrder具有多個SonOrders)

想要快速瀏覽: 想要發佈datamdel的圖像,但我不允許...因此,任何有關數據模型。

所以現在我生成我的數據庫,執行DDL腳本並嘗試運行下面的代碼:

using (DataContainer container = new DataContainer()) 
{ 
    MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1}; 
    SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240}; 
    songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"}); 
    songOrder.Comments.Add(new Comment{Text = "Cool song"}); 

    container.OrderBaseSet.AddObject(songOrder); //relevant line 
    musicOrder.SongOrders.Add(songOrder); 

    songOrder.Details.Clear(); 
    songOrder.Comments.Clear(); 
    container.OrderBaseSet.AddObject(musicOrder); 
    container.SaveChanges(); 
} 

在這種情況下「的SaveChanges」導致的異常告訴我一些關於失蹤外鍵關係.. 。

但是,如果我招行

container.OrderBaseSet.AddObject(songOrder); 

導致下面的代碼「清除」雙組分後:

using (DataContainer container = new DataContainer()) 
{ 
    MusicOrder musicOrder = new MusicOrder{Name = "Oldies", Quantity = 1}; 
    SongOrder songOrder = new SongOrder {Name = "Great balls of fire", Length = 240}; 
    songOrder.Details.Add(new Detail{Text = "Song from Jerry Lee Lewis"}); 
    songOrder.Comments.Add(new Comment{Text = "Cool song"}); 

    musicOrder.SongOrders.Add(songOrder); 

    songOrder.Details.Clear(); 
    songOrder.Comments.Clear(); 

    container.OrderBaseSet.AddObject(songOrder); //relevant line 
    container.OrderBaseSet.AddObject(musicOrder); 
    container.SaveChanges(); 
} 

一切工作正常。

正如你所看到的,我知道如何處理異常,我知道「雙添加」SongOrder是沒有意義的。但我想知道這是一個錯誤還是一個功能。爲什麼在我的第一個例子中拋出異常。真的很感謝全面的解釋。在我看來,實體框架也應該能夠處理第一個例子,而不是拋出異常。所以我會說這是一個錯誤。

隨意評論;)

安迪

回答

1

發生這種情況是因爲調用AddObject不僅添加單個實體,而且還添加所有未附加到上下文的相關實體。因此,當您在第一個示例中調用AddObject(songOrder)時,還需要添加DetailComment。但在此之後,您可以撥打導航屬性Remove以刪除DetialCommentRemove只會打破關係,但不會從上下文中刪除DetailComment(它只會將它們的主要關係設置爲空),因此一旦您嘗試調用SaveChanges,它將炸燬,因爲您試圖保存DetailComment沒有聯繫OrderBase(我想關係是非nullalbe)。

在第二個示例中,CommentDetail在向上下文添加命令之前被刪除,因此它的行爲與預期相同。

這不是一個「功能」的bug。

+0

謝謝你的回答。我在這裏沒有看到「功能」。如果實體框架「聰明」足以在首先添加細節和註釋,並且我沒有向數據庫提交任何內容,它也應該足夠聰明以從上下文中移除所有這些對象。總結一下:Entity上下文的行爲就好像一切都立即提交給數據庫一樣。所以我必須將其視爲數據庫存儲而不是對象上下文。 – CrazyChief 2011-06-06 05:44:47

1

你沒有songorder添加到基地。只需將歌曲添加到音樂,然後將音樂添加到底座。

它最可能不喜歡你添加與音樂無關的歌曲。

+0

嗨,謝謝你的回答。實體框架負責這些「多個」添加。即再次添加通過引用添加的對象不會導致數據庫中的異常或多重對象。 – CrazyChief 2011-06-06 05:50:17