没有视图模型的EF6 POCO INotifyPropertyChanged

时间:2014-09-16 06:23:25

标签: wpf entity-framework-6 poco inotifypropertychanged

我已经在WPF应用程序中直接绑定到模型类(并跳过创建单独的viewmodel类)。

现在,在切换到EF6和DBContext后,我遇到生成的EF POCO类的问题,因为它看起来有点棘手或者甚至不建议尝试直接对这些类实现INotifyPropertyChanged接口。

目前:

  • 我不想回到ObjectContext。
  • 我也不想改变T4太多。网上关于改变T4实现的建议 INotifyPropertyChanged对我来说太容易出错了。
  • 现在为每个类创建视图模型,纯粹是MVVM 可能是最好的,但自模型以来需要花费大量时间来实施 是巨大的。

我还有任何选项可以获得EF6 POCO类自动生成的属性来通知他们的更改吗?

1 个答案:

答案 0 :(得分:0)

T4模板是您最好的朋友。你几乎无法避免它们 选项1 - 修改现有的T4模板以实现INotifyPropertyChanged

  1. 创建实现INotifyPropertyChanged
  2. 的基类
  3. 修改T4模板中的getter和setter以通知他们的 财产变更
  4. 选项2 - 介绍DTO / ViewModels并使用AutoMapper

    1. 向项目添加新文件夹(或创建其他项目)
    2. 添加新的POCO代T4模板
    3. 稍微修改以符合您选择的视图模型
    4. 使用AutoMapper将这些Dto / ViewModel映射到实体
    5. 选项3 - 实现Postsharp,它使用面向方面的编程来实现INotifyPropertyChanged每个类的一行属性 - 再次,你必须在你的T4模板中添加几行

      编辑 - 示例 这是我的实体的T4模板,我添加了[DataContract]属性以允许POCO被序列化。

      foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
      {
          fileManager.StartNewFile(entity.Name + ".cs");
          BeginNamespace(code);
      #>
      <#=codeStringGenerator.UsingDirectives(inHeader: false)#>
          using System.Runtime.Serialization;
      [DataContract]
      <#=codeStringGenerator.EntityClassOpening(entity)#>
      {
      
      // Then further down
          var simpleProperties = typeMapper.GetSimpleProperties(entity);
          if (simpleProperties.Any())
          {
              foreach (var edmProperty in simpleProperties)
              {
      #>
          [DataMember]
          <#=codeStringGenerator.Property(edmProperty)#>
      <#