我正在使用ADO.NET实体框架来管理对象的层次结构。每个人都有一个父母,零个或多个孩子。
我在我的WPF应用程序中使用TreeView控件呈现这些内容。只需点击一下按钮,新事物就可以作为孩子添加到选定的东西......
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为空的uniqueidentifier。
这会使数据库变得混乱,并在第二次单击ButtonAddThing按钮后抛出以下异常。
例外:“违反PRIMARY KEY 约束'PK_Thing'。无法插入 对象'dbo.Thing'中的重复键。 声明已经终止。“
这些是生成的T-SQL插入语句......
父复制:
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 to Entities代码会复制这些父行?我该如何正确处理这种父/子关系?
更新:创建新东西时不仅仅是一个问题。我的“删除”按钮也无法正常工作。
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 Profiler。观察到的行为:
答案 0 :(得分:2)
你应该可以这样做:
Dim ParentId As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id NewThing.Parent = (From t In db.Thing _ Where t.Id = ParentId _ Select t).First
这将构建您想要的分层模型。