Wpf MVVM和实体框架中POCO类的含义

Wpf MVVM和实体框架中POCO类的含义,wpf,entity-framework,mvvm,data-binding,poco,Wpf,Entity Framework,Mvvm,Data Binding,Poco,我试图理解WPF绑定如何与MVVM和实体框架结合使用。到目前为止,我理解数据绑定是一个与属性相关的概念。然而,当它到达EF时,我就无法理解使用哪些对象来定义数据库的模型。例如,我有一个类别的模型类: public class Category : INotifyPropertyChanged { string _CategoryId; public string CategoryId { get

我试图理解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 DbSet<Category> Categories { get; set; }
公共数据库集类别{get;set;}
现在我失去了理解,在构建上下文模型时,我是使用Poco类还是非Poco类

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

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

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

在您的
类别
类中,我通常不会创建另一个模型类来更改
INotifyPropertyChanged
。您的
Category
类应称为
CategoryViewModel
,这一点更加灵活和明确

如果我阅读了你的代码,看到一个
INotifyPropertyChanged
接口,WPF也将其用于数据绑定,那么我会反对它,因为你现在使用的是Model->View pattern,而不使用ViewModel作为中间人。(假设你使用category作为绑定源)

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


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

我过去认为ViewModel与特定视图更相关。所以从技术上讲,你是说我的POCO版本的Category类可以被删除,而模型应该从普通类构建?它与特定的视图相关。总是1-1。您的模型可以从
工厂
类构建,这是另一种设计模式。如果您首先在EF中使用代码,那么无论您设置的对象类型是什么,都要映射到
。在给定的示例代码中,
Category
是映射回ORM的类型。因此,是的,您可以消除Poco类。EF不关心您的数据模型是否实现了INPC。事实上,没有人这样做。所以,让它实现INPC并在整个应用程序中使用它,从绑定到数据库。
public DbSet<Category> Categories { get; set; }