Wpf MVVM和实体框架中POCO类的含义
我试图理解WPF绑定如何与MVVM和实体框架结合使用。到目前为止,我理解数据绑定是一个与属性相关的概念。然而,当它到达EF时,我就无法理解使用哪些对象来定义数据库的模型。例如,我有一个类别的模型类: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
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; }