0
我正在使用ADO.NET實體框架來管理對象的層次結構。每個人都有一位父母,零個或多個孩子。爲什麼我的Linq to Entities代碼複製行?
我在和一個TreeView控件WPF應用程序呈現這些。新的東西可以添加爲孩子選擇的事情一個按鈕,點擊...
的Visual Basic ...
Private Sub ButtonAddThing_Click(...) Handles ButtonAddThing.Click Dim NewThing As New Thing NewThing.Id = Guid.NewGuid() NewThing.Parent = DirectCast(TreeViewThings.SelectedItem, Thing) ... db.AddToThing(NewThing) db.SaveChanges() TreeViewThings.UpdateLayout() End Sub
但是,有一個問題。它不是簡單地向數據庫添加新的Thing,而是首先添加父項的副本,但奇怪地使用Id的空uniqueIndicature。
這會使數據庫混亂並在第二次點擊按鈕ButtonAddThing後引發以下異常。
例外: 「PRIMARY KEY約束 'PK_Thing' 違反無法插入對象 'dbo.Thing' 重複鍵 的語句已終止。」
這些都是產生的T-SQL INSERT語句...
父重複:
exec sp_executesql N'insert [dbo].[Thing]([Id], [ParentId], ...) values (@0, @1, ...) ',N'@0 uniqueidentifier,@1 uniqueidentifier,...', @0='00000000-0000-0000-0000-000000000000', @1='389D987D-79B1-4A9D-970F-CE15F5E3E18A', ...
中新的東西:
exec sp_executesql N'insert [dbo].[Thing]([Id], [ParentId], ...) values (@0, @1, ...) ',N'@0 uniqueidentifier,@1 uniqueidentifier,...', @0='88641EBB-B7D7-4203-8191-B27E1D1E1840', @1='391FF0D9-40ED-4349-BB91-0F2E440EF8C9', ...
爲什麼我的LINQ到實體代碼複製這些父行?我怎樣才能妥善處理這種父母/子女關係?
更新:創建新事物不僅僅是一個問題。我的「刪除」按鈕也無法正常工作。
Private Sub ButtonDeleteThing_Click(...) db.DeleteObject(DirectCast(TreeViewThings.SelectedItem, Thing)) db.SaveChanges() End Sub
也不
Private Sub ButtonDeleteThing_Click(...) Dim Id As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id Dim DoomedThing As Thing = (From t In db.Thing _ Where t.Id = Id _ Select t).First db.DeleteObject(DoomedThing) db.SaveChanges() End Sub
我監視SQL Server事件探查,同時調試我的應用程序。觀察到的行爲:
- 第一個按鈕點擊刪除就好了。
- 第二個按鈕單擊插入一個重複的父親(空GUID uniqueidentifier主鍵),然後執行刪除操作。
- 第三個按鈕單擊失敗(違反PRIMARY KEY約束),因爲它無法用空的GUID主鍵插入第二個Thing。
這是我需要的正確方向的微調。謝謝。它現在生成一個額外的選擇查詢,但只有一個插入。 – 2009-02-13 18:47:53