【问题标题】:Meaning of POCO classes in MVVM and Entity FrameworkMVVM 和实体框架中 POCO 类的含义
【发布时间】:2015-05-08 15:34:56
【问题描述】:

我试图了解 WPF 绑定如何与 MVVM 和实体框架结合使用。到目前为止,我将数据绑定理解为与属性相关的概念。但是,当涉及到 EF 时,我无法理解使用哪些对象来定义数据库模型。例如,我有一个类别的模型类:

 public class Category : INotifyPropertyChanged
    {
        string _CategoryId;
        public string CategoryId
        {
            get
            {
                return _CategoryId;
            }
            set
            {
                if (_CategoryId != value)
                {
                    _CategoryId = value;
                    RaisePropertyChanged("CategoryId");
                }
            }
        }

        string _CategoryName;
        public string CategoryName
        {
            get
            {
                return _CategoryName;
            }
            set
            {
                if (_CategoryName != value)
                {
                    _CategoryName = value;
                    RaisePropertyChanged("CategoryName");
                }
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="prop"></param>
        void RaisePropertyChanged(string prop)
        {
            if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
        }
        public event PropertyChangedEventHandler PropertyChanged;

    }

和 POCO 版本:

public class CategoryPoco
{
    public CategoryPoco() { }

    public int CategoryId { get; set; }
    public string CategoryName { get; set; }
}

我理解的非 Poco 类的属性可以随后用于数据绑定。但是,我还需要构建数据库上下文模型:

public DbSet<Category> Categories { get; set; }

现在我失去了理解,在构建上下文模型时我是使用 Poco 类还是非 Poco 类?

当我开始与数据库交换数据时,如何匹配这两个类?

【问题讨论】:

  • EF 不在乎你的数据模型是否实现了 INPC。事实上,没有人这样做。所以让它实现 INPC 并在整个应用程序中使用它,从绑定到数据库。

标签: wpf entity-framework mvvm data-binding poco


【解决方案1】:

您使用“POCO 版本”为您的数据库构建上下文模型。如果您愿意,POCO 只是定义为

Plain Old CLR Object. Just a normal class, no attributes describing infrastructure concerns or other responsibilities that your domain objects shouldn't have.

所以从技术上讲,您的 Category 也被视为 POCO。与 MVVM 或 EF 一起使用时,POCO 没有不同的含义。 EF 只是使用这些对象将其映射回数据库。

在您的Category 类中,我通常不会为了拥有INotifyPropertyChanged 而创建另一个模型类。你的Category 类应该被称为CategoryViewModel 更加灵活和清晰。

如果我阅读了您的代码并且看到了一个INotifyPropertyChanged 接口WPF 也将它用于DataBinding,那么我会反对它,因为您现在使用的是Model -> View 模式,而没有ViewModel 作为您的中间人。 (假设您使用类别作为绑定源)

如果您决定需要扩展 Category 类,那么我建议使用 T4 模板将您的 POCO 类生成为部分类,并创建另一个实现 INotifyPropertyChanged 的部分类或添加更多属性不在给定表的列中,例如 CategoryStatus、CategoryDe​​scription 并使用 [NotMapped] 属性标记这些属性。

这样您就不必在两个类之间进行匹配,并且大部分 Model 已经在 ViewModel 中设置,以便与 EF 进行通信。您还可以灵活地为对象添加更多功能,这符合Open-Closed 设计原则。

【讨论】:

  • 我以前觉得ViewModel跟具体的View比较相关。所以从技术上讲,你是说我的 POCO 版本的 Category 类可以被淘汰,模型应该从普通类构建?
  • 与特定视图相关。总是1-1。您的模型可以从 Factory 类构建,这是另一种设计模式。如果您首先在 EF 中使用代码,那么无论您设置的任何对象类型都希望映射到 Table。在您给定的示例代码中,看起来 Category 是映射回 ORM 的类型。所以是的,你可以消除 Poco 类。
猜你喜欢
  • 2012-03-08
  • 2016-01-28
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多