與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是沒有意義的。但我想知道這是一個錯誤還是一個功能。爲什麼在我的第一個例子中拋出異常。真的很感謝全面的解釋。在我看來,實體框架也應該能夠處理第一個例子,而不是拋出異常。所以我會說這是一個錯誤。
隨意評論;)
安迪
謝謝你的回答。我在這裏沒有看到「功能」。如果實體框架「聰明」足以在首先添加細節和註釋,並且我沒有向數據庫提交任何內容,它也應該足夠聰明以從上下文中移除所有這些對象。總結一下:Entity上下文的行爲就好像一切都立即提交給數據庫一樣。所以我必須將其視爲數據庫存儲而不是對象上下文。 – CrazyChief 2011-06-06 05:44:47