繁体   English   中英

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

[英]I cant add an item to a Self Tracking Entity Collection with Navigation Properties

我有一个WPF 4应用程序,可通过自我跟踪实体(STE 5)访问我的数据。 我有一个WPF内容控件,其数据上下文设置为STE的模型类( 供应商 )。 供应商类的导航属性为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的新手,正在遇到麻烦。

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

提前致谢

所以我现在有一个可行的“解决方案” 也许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上下文添加对象,而不是像我提供的第一个代码中那样的供应商对象。

这样就可以了,但是感觉就像是在破解,就像我在做错误的事情一样。 fixup方法是从vendor_account类的“ vendor” setter属性中调用的,它尝试删除并向该供应商添加vendor_account对象,然后引发我在第一篇文章中概述的错误。

我仍然不明白为什么我首先遇到了错误。 也许与WPF有关,它直接将Listview绑定到导航属性(T可追踪类型(T))。

现在,我将使用它,但是如果有人可以帮助我更好地理解这个问题,我将非常感谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM