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

时间:2015-05-08 15:34:56

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

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

 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类?

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

1 个答案:

答案 0 :(得分: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课程中,我通常不会创建另一个Model类,只是为了INotifyPropertyChanged。更灵活,更清晰,您的Category课程应该被称为CategoryViewModel

如果我读了你的代码并且我看到一个INotifyPropertyChanged接口,WPF也将它用于DataBinding,那么我会反对它,因为你现在正在使用Model - &gt;查看不使用ViewModel作为中间人的模式。 (假设您使用类别作为绑定源)

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

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