我试图了解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类?
开始与数据库交换数据时如何匹配两个类?
您可以使用“ POCO版本”为数据库构建上下文模型。如果您愿意,POCO的定义为
因此从技术上讲,您Category
也被视为POCO。当与MVVM或EF一起使用时,POCO没有不同的含义。EF只是使用这些对象将其映射回数据库。
在您的Category
班级中,我通常不会仅仅为了拥有那个而创建另一个Model类INotifyPropertyChanged
。更加灵活和明确地Category
应该调用您的类CategoryViewModel
。
如果我阅读了您的代码,并且看到了WPF还将其用于DataBinding的INotifyPropertyChanged
接口,那么我将不赞成它,因为您现在使用的是Model-> View模式,而没有将ViewModel作为中间人。 (假设您使用类别作为绑定源)
如果您决定需要扩展Category
类,那么我建议使用T4模板将POCO类生成为部分类,并创建另一个实现INotifyPropertyChanged
或添加不在给定表的列中的属性的部分类,例如,CategoryStatus,CategoryDescription并使用[NotMapped]属性标记这些属性。
这样,您不必在两个类之间进行匹配,并且大多数情况下您Model
已经在中ViewModel
进行了设置,可以将其与EF通信。您还可以灵活地向对象添加更多功能,这符合Open-Closed
设计原则。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句