我试图了解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类?
当我开始与数据库交换数据时,如何匹配这两个类?
答案 0 :(得分:1)
您使用“POCO版本”为您的数据库构建上下文模型。如果您愿意,POCO只是定义为
技术上,您的Category
也被视为POCO。与MVVM或EF一起使用时,POCO没有不同的含义。 EF只是使用这些对象将其映射回数据库。
在Category
课程中,我通常不会创建另一个Model类,只是为了INotifyPropertyChanged
。更灵活,更清晰,您的Category
课程应该被称为CategoryViewModel
。
如果我读了你的代码并且我看到一个INotifyPropertyChanged
接口,WPF也将它用于DataBinding,那么我会反对它,因为你现在正在使用Model - &gt;查看不使用ViewModel作为中间人的模式。 (假设您使用类别作为绑定源)
如果您决定需要扩展Category
类,那么我建议使用T4模板将POCO类生成为部分类,并创建另一个实现INotifyPropertyChanged
或添加的部分类更多属性不在给定表的列中,例如,CategoryStatus,CategoryDescription,并使用 [NotMapped]属性标记这些属性。
这样您就不必在两个类之间进行匹配,而且Model
中已经设置了ViewModel
,以便与EF进行通信。您还可以灵活地向对象添加更多功能,这符合Open-Closed
设计原则。