WPF中的实体框架POCO类和ViewModel

时间:2015-02-01 13:41:13

标签: c# wpf entity-framework viewmodel poco

如何解决数百个 POCO 模型的问题而没有实现 INotifyPropertyChanged 和其他WPF内容使用最有效的方式为WPF提供这些功能?

现在我使用 EntityFramework 和简单的 POCO 类以及手工编写的 ViewModels

我的架构看起来像这样:

  • 查看
  • 视图模型
  • 存储库模式
  • WCF存储库或数据库存储库
  • 业务逻辑
  • 实体框架
  • POCO模型类

我的想法是:

  1. 使用自动映射 POCO 类映射到 ViewModels 类,然后再手动创建这些ViewModel。
  2. 使用 T4 生成基础 ViewModels 作为 POCO 类之前生成的包装,编写​​我自己的(或使用现有解决方案)实例解析程序类,在 EF 中提供相同的功能(一个实例=数据库中的一个记录)。
  3. 我很困惑,因为我不喜欢自己的解决方案,现在不稳定,但 Automapper 使用反思映射。

    怎么办?您是否知道一些非常棒的,非常棒的工具来完成这些神奇的事情,并为我提供了添加和扩展ViewModel的灵活性?

1 个答案:

答案 0 :(得分:2)

我相信你会认为:

  1. 通常在ViewModel
  2. 中创建Model对象的副本
  3. 通常在ViewModel的每个对象中实现INotifyPropertyChanged
  4. 我认为这两种假设都是错误的。 请查看以下代码示例:

    class Customer
    {
      public int ID {get; set;}
      public string Name {get; set;}
    }
    
    class MyViewModel: INotifyPropertyChanged
    {
      // Hook you repository (model) anyway you like (Singletons, Dependency Injection, etc)
      // For this sample I'm just crating a new one
      MyRepository repo = new MyRepository();
    
      public List<Customer> Customers 
      {
        get { return repo.Customers;}
      }
    
      public void ReadCustomers()
      {
        repo.ReadCustomers();
        InternalPropertyChanged("Customers");
      }
    
      public event PropertyChangedEventHandler PropertyChanged;
      protected void InternalPropertyChanged(string name)
      {
        if (PropertyChanged != null)
          PropertyChanged(this, new PropertyChangedEventArgs(name));
      }
    }
    
    class MyRepository
    {
      private List<Customer> customers;
      public List<Customer> Customers
      {
        get { return customers; }
      }
    
      public void ReadCustomers()
      {
        // db is the Entity Framework Context
        // In the real word I would use a separate DAL object
        customers = db.Customers.ToList();
      }
    }
    

    客户是实体框架返回的列表。 ViewModel属性Customers是一个简单的passthrough属性,它指向Model属性。

    在此示例中,我不在Customer中使用INotifyPropertyChanged。 我知道只有当用户调用ReadCustomers()时才能修改Customers列表,所以我在其中调用了PropertyChanged。

    如果我需要为Customer类触发PropertyChanged通知,我将直接在Customer类上实现INotifyPropertyChanged。