0

我正在使用 ADO.NET Entity Framework 来管理对象的层次结构。每个人都有一个单亲和零个或多个孩子。

ADO.NET 实体框架对象与父和子 http://img14.imageshack.us/img14/7158/thingpi1.gif

我在我的 WPF 应用程序中使用 TreeView 控件呈现这些。只需单击一个按钮,即可将新事物作为子项添加到所选事物中...

视觉基本...

Private Sub ButtonAddThing_Click(...) 处理 ButtonAddThing.Click
    将新事物视为新事物
    NewThing.Id = Guid.NewGuid()
    NewThing.Parent = DirectCast(TreeViewThings.SelectedItem, Thing)
    ...
    db.AddToThing(新事物)
    db.SaveChanges()
    TreeViewThings.UpdateLayout()
结束子

但是,有一个问题。它不是简单地将新事物添加到数据库中,而是首先添加父事物的副本,但奇怪的是,ID 的唯一标识符为空。

这会使数据库变得混乱,并在第二次单击按钮 ButtonAddThing 后引发以下异常。

例外:“违反主键约束‘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 代码会重复这些父行?如何正确处理这种父/子关系?


更新:这不仅仅是创建新事物时的问题。我的“删除”按钮也不能正常工作。

私有子按钮DeleteThing_Click(...)
    db.DeleteObject(DirectCast(TreeViewThings.SelectedItem, Thing))
    db.SaveChanges()
结束子

也不

私有子按钮DeleteThing_Click(...)
    Dim Id As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id
    Dim DoomedThing As Thing = (From t In db.Thing _
                                其中 t.Id = Id _
                                选择 t).First
    db.DeleteObject(DoomedThing)
    db.SaveChanges()
结束子

我在调试应用程序时正在监视 SQL Server Profiler。观察到的行为:

  1. 第一个按钮单击删除就好了。
  2. 第二个按钮单击插入一个重复的父项(空 GUID 唯一标识符主键),然后执行删除。
  3. 第三个按钮单击失败(违反 PRIMARY KEY 约束),因为它无法插入具有空 GUID 主键的第二个事物。
4

1 回答 1

2

你应该能够做这样的事情:

Dim ParentId As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id
NewThing.Parent =(从 t 在 db.Thing _
                  其中 t.Id = ParentId _
                  选择 t).First

这将建立你想要的层次模型。

于 2009-02-13T18:29:25.513 回答