0

这是 WPF + MVVM + EF。我的数据库中有一张销售订单表。在 UI 中,我显示了一个包含所有 SalesOrderNumbers 的 ComboBox 和一个带有标签和 TextBoxes 的网格,它们显示了 ComboBox 中所选订单的详细信息。考虑以下 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绑定AllSalesOrderNumbersSelectedValue绑定到SelectedOrderNumber(with Mode=OneWayToSource)。另一方面,Grid 的 DataContext 绑定到SelectedOrder. 整个工作正常。

我的问题是关于“新销售订单”按钮。为了添加新记录,ICommand在我的 ViewModel 中添加了一个,它基本上执行以下操作:

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

我对以下内容感到困惑:

  1. SelectedOrder在模型中查询 SelectedOrderNumber 属性的当前值。由于数据库还没有这个新记录,它返回 null。在去数据库之前,我如何要求它查看本地上下文对象?

  2. 与 DataSet 不同,它不会为 分配负递增的标识值orderNumber,所以我想知道如果我添加另一个订单会发生什么。

  3. context.SalesOrders在上面的第二行 ( context.SalesOrders.AddObject(NewOrder)) 执行后,我没有在集合中看到新添加的订单对象。

4

1 回答 1

0

技术答案:

1.SelectedOrder 向模型查询 SelectedOrderNumber 属性的当前值。由于数据库还没有这个新记录,它返回 null。在去数据库之前,我如何要求它查看本地上下文对象?

DbSet您可以像这样查询本地集合:

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

2.与DataSets不同,它不会为orderNumber分配负递增的标识值,所以我想知道如果我添加另一个订单会发生什么。

当您添加新Order的 s 时,EF 会将它们中的每一个作为单独的实例进行跟踪。

3.上面第2行(context.SalesOrders.AddObject(NewOrder))执行后,context.SalesOrders集合中没有看到新添加的订单对象。

请参阅 1。它在Local集合中。

架构答案:context在您的视图模型中拥有一个不是最佳选择。视图模型不应该担心它的数据,它应该接收数据,然后是自包含的。它的职责是响应用户交互并将这些通知给控制器或服务层。因此,模型应该填充一个Orders 列表,然后释放上下文。当添加新命令时,模型应该立即或在保存命令之后告诉控制器,并且可能会收到一个命令以(重新)显示Order. 因此,视图模型无需了解数据层的技术细节。

于 2013-02-24T19:26:29.483 回答