MVVM 和 Entity Framework 中 POCO 类 的含义

Meaning of POCO classes in MVVM and Entity Framework

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

 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 class 的属性可以用于数据绑定。但是,我还需要构建数据库上下文模型:

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

现在这是我失去理解的地方,在构建上下文模型时我使用 Poco 还是非 Poco classes?

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

您使用 "POCO version" 为您的数据库构建上下文模型。 如果您愿意,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。 POCO 在与 MVVM 或 EF 一起使用时没有不同的含义。 EF 只是使用这些对象将其映射回数据库。

在您的 Category class 中,我通常不会创建另一个模型 class 只是为了拥有那个 INotifyPropertyChanged。你的 Category class 应该叫 CategoryViewModel 更灵活和清晰。

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

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

这样您就不必在两个 class 之间进行匹配,而且大多数情况下您的 Model 已经在 ViewModel 中设置好与 EF 进行通信。您还可以灵活地向对象添加更多功能,这符合 Open-Closed 设计原则。