MVVM 和 Entity Framework 中 POCO 类 的含义
Meaning of POCO classes in MVVM and Entity Framework
我试图了解 WPF 绑定如何与 MVVM 和 Entity Framework 结合工作。到目前为止,我将数据绑定理解为与属性相关的概念。但是,当涉及到 EF 时,我不了解使用哪些对象来定义数据库模型。例如,我有一个类别的模型 class:
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 class 的属性可以用于数据绑定。但是,我还需要构建数据库上下文模型:
public DbSet<Category> Categories { get; set; }
现在这是我失去理解的地方,在构建上下文模型时我使用 Poco 还是非 Poco classes?
当我开始与数据库交换数据时,如何匹配两个 classes?
您使用 "POCO version" 为您的数据库构建上下文模型。 如果您愿意,POCO 只是定义为
所以从技术上讲,您的 Category
也被视为 POCO。 POCO 在与 MVVM 或 EF 一起使用时没有不同的含义。 EF 只是使用这些对象将其映射回数据库。
在您的 Category
class 中,我通常不会创建另一个模型 class 只是为了拥有那个 INotifyPropertyChanged
。你的 Category
class 应该叫 CategoryViewModel
更灵活和清晰。
如果我阅读了您的代码并且看到了一个 INotifyPropertyChanged
接口 ,其中 WPF 也将它用于 DataBinding,那么我会反对它,因为您现在使用的是模型 -> 视图模式而没有ViewModel 作为你的中间人。 (假设你使用类别作为你的绑定源)
如果您决定需要扩展 Category
class,那么我建议使用 T4 模板生成您的 POCO 类 作为部分 class,并创建另一个实现 INotifyPropertyChanged
的部分 class 或添加更多不在给定 table 的列中的属性,例如 CategoryStatus、CategoryDescription 并用 [ 标记这些属性NotMapped] 属性。
这样您就不必在两个 class 之间进行匹配,而且大多数情况下您的 Model
已经在 ViewModel
中设置好与 EF 进行通信。您还可以灵活地向对象添加更多功能,这符合 Open-Closed
设计原则。
我试图了解 WPF 绑定如何与 MVVM 和 Entity Framework 结合工作。到目前为止,我将数据绑定理解为与属性相关的概念。但是,当涉及到 EF 时,我不了解使用哪些对象来定义数据库模型。例如,我有一个类别的模型 class:
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 class 的属性可以用于数据绑定。但是,我还需要构建数据库上下文模型:
public DbSet<Category> Categories { get; set; }
现在这是我失去理解的地方,在构建上下文模型时我使用 Poco 还是非 Poco classes?
当我开始与数据库交换数据时,如何匹配两个 classes?
您使用 "POCO version" 为您的数据库构建上下文模型。 如果您愿意,POCO 只是定义为
所以从技术上讲,您的 Category
也被视为 POCO。 POCO 在与 MVVM 或 EF 一起使用时没有不同的含义。 EF 只是使用这些对象将其映射回数据库。
在您的 Category
class 中,我通常不会创建另一个模型 class 只是为了拥有那个 INotifyPropertyChanged
。你的 Category
class 应该叫 CategoryViewModel
更灵活和清晰。
如果我阅读了您的代码并且看到了一个 INotifyPropertyChanged
接口 ,其中 WPF 也将它用于 DataBinding,那么我会反对它,因为您现在使用的是模型 -> 视图模式而没有ViewModel 作为你的中间人。 (假设你使用类别作为你的绑定源)
如果您决定需要扩展 Category
class,那么我建议使用 T4 模板生成您的 POCO 类 作为部分 class,并创建另一个实现 INotifyPropertyChanged
的部分 class 或添加更多不在给定 table 的列中的属性,例如 CategoryStatus、CategoryDescription 并用 [ 标记这些属性NotMapped] 属性。
这样您就不必在两个 class 之间进行匹配,而且大多数情况下您的 Model
已经在 ViewModel
中设置好与 EF 进行通信。您还可以灵活地向对象添加更多功能,这符合 Open-Closed
设计原则。