0

これは WPF + MVVM + EF です。DB に販売注文のテーブルがあります。UI では、すべての SalesOrderNumbers を含む ComboBox と、ComboBox で選択された注文の詳細を示す Labels と TextBoxes を含む Grid を表示します。次の ViewModel を検討してください。

Class SalesOrderViewModel
    Public Property AllSalesOrderNumbers As List(Of Integer)

    Public Sub New()
        AllSalesOrderNumbers = context.SalesOrders.Select(Function(x) x.orderNumber).ToList()
        If AllSalesOrderNumbers.Count > 0 Then SelectedOrderNumber = AllSalesOrderNumbers(0)
    End Sub

    Private Property mSelectedOrderNumber As Integer
    Public Property SelectedOrderNumber As Nullable(Of Integer)
        Get
            Return mSelectedOrderNumber
        End Get
        Set(value As Nullable(Of Integer))
            mSelectedOrderNumber = value
        End Set
    End Property

    Public ReadOnly Property SelectedOrder As SalesOrder
        Get
           Return context.SalesOrders.FirstOrDefault(Function(x) x.orderNumber = SelectedOrderNumber)
        End Get
    End Property
End Class 

UI では、ComboBoxItemsSourceは にバインドさAllSalesOrderNumbersれ、 (with で)SelectedValueバインドされます。一方、Grid の DataContext は にバインドされています。全体が正常に動作しています。SelectedOrderNumberMode=OneWayToSourceSelectedOrder

私の質問は、新規受注ボタンについてです。新しいレコードを追加するICommandために、基本的に次のことを行う ViewModel に を追加しました。

Dim NewOrder = context.SalesOrders.CreateObject()
context.SalesOrders.AddObject(NewOrder)
mSelectedOrderNumber = NewOrder.orderNumber
AllSalesOrderNumbers.Add(mSelectedOrderNumber)

私は次のことについて混乱しています:

  1. SelectedOrderSelectedOrderNumber プロパティの現在の値をモデルに照会します。DB にはまだこの新しいレコードがないため、null が返されます。DBに行く前にローカルコンテキストオブジェクトを調べるように依頼するにはどうすればよいですか?

  2. DataSets とは異なり、負に増加する ID 値を に割り当てないorderNumberので、別の順序を追加するとどうなるか気になります。

  3. 上記の 2 行目 ( ) が実行されcontext.SalesOrdersた後、新しく追加された注文オブジェクトがコレクションに表示されません。context.SalesOrders.AddObject(NewOrder)

4

1 に答える 1

0

技術的な答え:

1.SelectedOrder は、SelectedOrderNumber プロパティの現在の値をモデルに照会します。DB にはまだこの新しいレコードがないため、null が返されます。DBに行く前にローカルコンテキストオブジェクトを調べるように依頼するにはどうすればよいですか?

DbSet次のようなローカル コレクションをクエリできます。

context.SalesOrders.Local.FirstOrDefault(...)

2.DataSet とは異なり、orderNumber に負の増分の ID 値を割り当てないため、別の順序を追加するとどうなるか気になります。

新しい を追加するOrderと、EF はそれらのそれぞれを個別のインスタンスとして追跡します。

3. 上記の 2 行目 (context.SalesOrders.AddObject(NewOrder)) が実行された後、context.SalesOrders コレクションに新しく追加された注文オブジェクトが表示されません。

1を参照してください。Localコレクションにあります。

アーキテクチャの答え:contextビュー モデルに を含めることは、最良の選択ではありません。ビューモデルはそのデータについて心配する必要はありません。データを受け取り、その後自己完結する必要があります。その役割は、ユーザー インタラクションに応答し、それらをコントローラーまたはサービス レイヤーに通知することです。したがって、モデルに のリストを設定する必要がありOrderます。その後、コンテキストが破棄されます。新しい注文が追加されると、モデルはコントローラーに即座に、または保存コマンドの後に通知する必要がありますOrder。そのため、ビュー モデルはデータ層の技術的な詳細を知る必要がありません。

于 2013-02-24T19:26:29.483 に答える