我无法将项目添加到具有导航属性的自我跟踪实体集合

时间:2013-02-10 06:37:32

标签: wpf vb.net entity-framework self-tracking-entities

我有一个WPF 4应用程序,我的数据通过自我跟踪实体(STE 5)访问。我有一个WPF内容控件,其数据上下文设置为STE的模型类(供应商)。供应商类的导航属性为 vendor_accounts 。我可以成功获取这些供应商帐户的集合,并将它们绑定到内容控件中的列表视图。但是,当我尝试将新的vendor_account对象添加到集合时,我收到以下错误

  

在CollectionChanged事件期间无法更改ObservableCollection。

这是我用来添加到listview集合的简化的vb.NET代码:

Private Sub AddAccountExecute()

    Dim newAcc As New vendor_account With {.chrAccName = "New Account Name", .chrAccNumber = "New #"}

    VendorSelection.vendor_account.Add(newAcc)
    ''FTC_Context is the object context for the STE data access model
    FTC_Context.SaveChanges()

End Sub

在生成的STE模板代码中的以下子中抛出此错误。错误出现在 previousValue.vendor_account.Remove(Me)

Private Sub Fixupvendor(ByVal previousValue As vendor)
    If IsDeserializing Then
        Return
    End If

    If previousValue IsNot Nothing AndAlso previousValue.vendor_account.Contains(Me) Then
        previousValue.vendor_account.Remove(Me)
    End If

    If vendor IsNot Nothing Then
        vendor.vendor_account.Add(Me)

        idVendor = vendor.idVendor
    End If
    If ChangeTracker.ChangeTrackingEnabled Then
        If ChangeTracker.OriginalValues.ContainsKey("vendor") AndAlso
            ChangeTracker.OriginalValues("vendor") Is vendor Then
            ChangeTracker.OriginalValues.Remove("vendor")
        Else
            ChangeTracker.RecordOriginalValue("vendor", previousValue)
        End If
        If vendor IsNot Nothing AndAlso Not vendor.ChangeTracker.ChangeTrackingEnabled Then
            vendor.StartTracking()
        End If
    End If
End Sub

我注释掉该行和项目可以成功添加到account_vendor集合中(这不是一个可接受的修复,因为它修改了自动生成的代码,每次更新我的STE模型时都会重新创建)。
所以我在FTC_Contect.SaveChanges()中添加了上面注释掉的代码行来测试数据库是否得到更新。但是现在我在保存更改行上收到以下错误:

  

违反了多重性约束。角色'供应商'   关系'FTC_devModel.FK_vendor_account_vendor'具有多重性   1或0..1。

我是STE的新手,我遇到了麻烦。

所以,我的问题是,有人可以通过提供一个如何使用“导航属性”添加/删除记录的示例来帮助我,或者帮助我纠正上面的代码。

提前致谢

1 个答案:

答案 0 :(得分:0)

所以我现在有一个工作“解决方案”。也许黑客是一个更好的术语。

我更改了STE实体框架模板(FTCModel.tt)以排除该行: previousValue.vendor_account.Remove(Me)

我将addAccountExecute子代码更改为:

Dim vendorAccount As New vendor_account With {.idVendor = idVendor,
                                                              .chrAccName = "New Account Name",
                                                              .chrAccNumber = "New #"}
FTC_Context.vendor_account.AddObject(vendorAccount)
FTC_Context.SaveChanges()

使用STE上下文添加对象而不是像我提供的第一个代码中那样添加供应商对象。

所以它正在运作,但这感觉就像一个黑客,就像我做错了一样。从vendor_account类的“vendor”setter属性调用fixup方法,它尝试删除然后将vendor_account对象添加到供应商,然后抛出我在第一篇文章中概述的错误。

我仍然不明白为什么我首先得到错误。也许它与WPF直接将listview绑定到导航属性(类型为trackablecollection(of T))有关。

现在我会用这个,但如果有人能帮我理解这个问题,我真的很感激。