【问题标题】:Why is my Linq to Entities code duplicating rows?为什么我的 Linq to Entities 代码重复行?
【发布时间】:2009-02-13 18:14:36
【问题描述】:

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

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

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

Visual Basic...

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 主键的第二个事物。

【问题讨论】:

    标签: .net linq entity-framework hierarchy


    【解决方案1】:

    你应该可以做这样的事情:

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

    这将构建您想要的层次模型。

    【讨论】:

    • 这是我需要的正确方向的推动。谢谢。它现在生成一个额外的选择查询,但只有一个插入。
    • 没问题。如果 ParentId 是表中的一个字段,您应该能够: Dim ParentId As Guid = DirectCast(TreeViewThings.SelectedItem, Thing).Id Thing.ParentId = ParentId db.SaveChanges() TreeViewThings.UpdateLayout() 否?它会为您节省选择。
    • 丢失了我拥有的所有格式,但我相信你能明白我想说什么。我一直不明白为什么在 VB 中,语法使用换行符来确定语句的结尾而不是另一个字符(如 C# 中的“;”)
    • 'ParentId' 不是'Thing' 的成员。我不能只处理 GUID。
    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多