2009-02-13 49 views
0

我正在使用ADO.NET實體框架來管理對象的層次結構。每個人都有一位父母,零個或多個孩子。爲什麼我的Linq to Entities代碼複製行?

ADO.NET Entity Framework Object with parent and children http://img14.imageshack.us/img14/7158/thingpi1.gif

我在和一個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事件探查,同時調試我的應用程序。觀察到的行爲:

  1. 第一個按鈕點擊刪除就好了。
  2. 第二個按鈕單擊插入一個重複的父親(空GUID uniqueidentifier主鍵),然後執行刪除操作。
  3. 第三個按鈕單擊失敗(違反PRIMARY KEY約束),因爲它無法用空的GUID主鍵插入第二個Thing。

回答

2

你應該能夠做這樣的事情:

 
Dim ParentId As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id 
NewThing.Parent = (From t In db.Thing _ 
        Where t.Id = ParentId _ 
        Select t).First 

,將建立你要去的層次模型。

+0

這是我需要的正確方向的微調。謝謝。它現在生成一個額外的選擇查詢,但只有一個插入。 – 2009-02-13 18:47:53