0

Self Tracking Entities (STE 5) を介してデータにアクセスする WPF 4 アプリケーションがあります。データ コンテキストが STEのモデル クラス ( vendor ) に設定された WPF コンテンツ コントロールがあります。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' のロール 'vendor' の多重度は 1 または 0..1 です。

私は STE を初めて使用し、問題を抱えています。

それで、私の質問は、「ナビゲーションプロパティ」を使用してレコードを追加/削除する方法の例を提供するか、上記のコードを修正するのを手伝ってくれる人がいるということです。

前もって感謝します

4

1 に答える 1

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 コンテキストを使用してオブジェクトを追加します。

動作していますが、これはハックのように感じます。まだ何か間違ったことをしているようです。fixup メソッドは vendor_account クラスの「vendor」セッター プロパティから呼び出され、vendor_account オブジェクトを削除してからベンダーに追加しようとします。これにより、最初の投稿で概説したエラーがスローされます。

そもそもなぜエラーが発生したのか、まだわかりません。リストビューをナビゲーション プロパティ (タイプ trackablecollection(of T)) に直接バインドする WPF と関係があるのか​​もしれません。

今のところこれを使用しますが、誰かがこの問題をもう少しよく理解するのを手伝ってくれると本当にありがたいです.

于 2013-02-11T05:25:34.857 に答える