您需要记住的一件事是,像实体框架这样的 ORM 实际上并没有创建简单的数据访问层(当通过一般的 3 层架构查看时)。它们为您提供的更多的是一个业务层,对数据访问交互具有更精细的控制级别。我认为可以说 EF 本质上成为您的 DAL,而上下文和实体类型可以是 BLL。
当通过更多的 MVC 或 MVVM 架构查看时,这条线更容易看到,其中您有一个模型(您的 EF 层)、一个控制器或视图模型(业务逻辑所在的位置,它封装了模型)和一个视图。
无论如何,因为 EF 实际上必须直接实例化实体类型,所以继承不会对您有多大好处,因为 EF 不会使用您的子类型作为返回的实体。EF 中验证和类似任务的解决方案是同时使用部分类(您显然知道)和部分方法。OnPROPERTYNAMEChanging
EF 中的默认代码生成模板为和的所有标量属性生成部分方法OnPROPERTYNAMEChanged
。
例如,如果您的实体类型有一个int UserId
属性User
,您可以创建一个部分类,如下所示:
public partial class User
{
partial void OnUserIdChanging(int newUserId)
{
// do something
}
partial void OnUserIdChanged()
{
// do something
}
}
当然,如果您愿意,您可以只使用其中一种。部分方法相对于继承调用的优势(假设它甚至是可能的)是部分方法是非虚拟的(因此没有虚拟表查找来调用正确的成员)并且仅在存在时编译为类的一部分一个实际的实现。
换句话说,即使您可以进入设计器代码并查看声明
partial void OnUserIdChanging(int value);
partial void OnUserIdChanged();
如果您实际上没有向函数添加方法体,那么 C# 编译器会从代码中完全删除该函数以及对它的所有调用,就好像它从一开始就从未存在过一样。这使得类型更小并且对其他属性的调用更快,因为它不必为调用空函数而烦恼。