c# - 应将包装的 EF 实体保存在哪个类中?

标签 c# wpf entity-framework mvvm

我有一个用 MVVM 实现编写的 WPF 应用程序。 MVVM 模式没有额外的框架。

我的 EF db 实体首先包装在他们自己的 View 模型中,我有一个模型 Controller 可以将它们从“窗口” View 模型加载到他们的 View 模型中。

实体 View 模型示例:

public class PurchaseOrderViewModel : ViewModels.ViewModelBase
{
    private someType _prop;
    public someType Prop 
    {
        get
        {
            return _prop;
        }
        set 
        {
            _prop = value;
            OnPropertyChanged();
        }
    }

    // ... 
    // Other Properties
    // ... 

    public PurchaseOrderViewModel() {
        // default constructor for LINQ
    }
    public PurchaseOrderViewModel(purchaseorder entity)
    {
        // load values from entity in properties
    }
}

窗口 View 模型示例:
public class MainViewModel: ViewModels.ViewModelBase
{
    private IModelController modelController = new ModelController();

    private List<PurchaseOrderViewModel> _poList;
    public List<PurchaseOrderViewModel> POList
    {
        get
        {
            return _poList;
        }
        set 
        {
            _poList = value;
            OnPropertyChanged();
        }
    }

    // ... 
    // Other Properties
    // ... 

    public MainViewModel()
    {
        POList = modelController.GetPurchaseOrders();
    }
}

模型 Controller 示例:
public class ModelController : IModelController
{
    public List<PurchaseOrderViewModel> GetPurchaseOrders() 
    {
        using (var model = new DBContext())
        {
            return model.purchaseorders
                        .Select(new PurchaseOrderViewModel { /* assign properties */ })
                        .ToList();
        }
    }
}

用户完成编辑后,我应该在哪里保存这个包装好的 View 模型(PurchaseOrderViewModel)?如我所见,有两种选择:
  • 在每个 View 模型中创建一个指向 modelController 的保存函数,但这感觉是一种不合适的方法。
  • 在模型 Controller 中创建一个保存函数并将 View 模型作为参数传递

  • 我很可能在 MVVM 模式中遗漏了一些东西,但请指出我正确的方向。谢谢!

    编辑 :我从提供的信息中排除了 View (MainView),但该 View 直接绑定(bind)到 MainViewModel 公开的属性。

    最佳答案

    首先,我可能不会命名它 ModelController因为这有点令人困惑,让人认为你在说 MVC。相反,如果你称它为 xxxx Service (例如 PurchaseOrdersService )它更有意义,并且不再感觉“不合适”,因为拥有 虚拟机 委托(delegate)实际工作是许多 IoC 用户所做的。此外,它还能保存您的 虚拟机 干净的。

    注意 : 我所说的“服务”不一定是指您的虚拟机 将直接调用 WCF 服务(您也不应该)。服务只是代表客户以抽象和封装的方式实现某事的一种手段。示例包括:

  • 将信息保存到数据库
  • 获取当前日志机制
  • 它们甚至可以是外观,它们可以创建 WCF 客户端代理并代表您调用远程服务,而无需您了解详细信息。


  • 所以一个典型的流程是:

    命令 >> 查看 后面的代码 >> 虚拟机 >> 服务

    我在后面包含 View 代码的原因是,通常这是您:
  • 捕获异常
  • 起点async/await异步调用您的虚拟机 和服务

  • 现在,当您将来自 VM 的上下文传递回服务时,没有关于您传递的确切内容的规则,但是我认为没有理由传递 虚拟机 到服务,因为它包含服务不关心的信息。

    只需通过 手机 你的虚拟机 应该首先绑定(bind)并通过绑定(bind)继续更新。

    关于c# - 应将包装的 EF 实体保存在哪个类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46807071/

    相关文章:

    asp.net-mvc - 更新数据库 - 列不存在

    c# - Windows 10 上的 MSHTML DLL

    c# - 'CustomerId' 操作的结果中不存在所需的列 'FromSql'

    c# - 媒体元素显示 H264 比特流 [UWP]

    c# - 同一行中的两个 div

    c# - 循环静态只读字段定义的奇怪行为

    c# - 强制模式仅适用于 Y 轴 Unity3D

    c# - Listpicker 错误 SelectedItem 必须始终设置为有效值

    c# - 如何在WPF中的ListBox中根据高度显示项目?

    asp.net - 在 EF 的自联接表中选择最后一个 child