0

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

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

这是我用来添加到列表视图集合中的简化 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 的新手,遇到了麻烦。

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

提前致谢

4

1 回答 1

0

所以我现在有一个可行的“解决方案”。也许 hack 是一个更好的术语。

我更改了 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 将列表视图直接绑定到导航属性(类型为 trackablecollection(of T))有关。

现在我将使用它,但如果有人能帮助我更好地理解这个问题,我将不胜感激。

于 2013-02-11T05:25:34.857 回答