我正在使用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 . 观察到的行为:
-
第一个按钮单击删除就好了 .
-
第二个按钮单击插入duplicate-ish parent(空GUID uniqueidentifier主键),然后执行删除 .
-
第三个按钮单击失败(违反PRIMARY KEY约束),因为它无法插入带有空GUID主键的第二个Thing .
1 回答
你应该可以做这样的事情:
这将构建您想要的分层模型 .