如何使用抽象类型的导航属性实现基于 EF Core 抽象的模型

How to implement EF Core abstract based model with navigation properties of abstract types

我正在尝试使用 Entity Framework Core 实现基于 DDD 的通用实体。 我有 2 个独立的数据库,外部的和内部的,它们在某些地方共享共同的 table 模型和逻辑。 我试图以这种方式实现它:

public abstract class EmployeeBase
{
  public Guid Id {get;}
  public string Name {get; protected set;}
  public Guid DepartmentId {get; protected set;}

  public DeparmentBase {get; protected set;}

  public void DomainMethod1() {...}
  public void DomainMethod2() {...}
}
public class InternalEmployee : EmployeeBase
{
}
public class ExternalEmployee : EmployeeBase
{
}
public abstract class DepartmentBase
{
  public Guid Id {get;}
  public string Name {get; protected set;}

  public ICollection<EmployeeBase> Employees {get; protected set;}

  public void DomainMethod1() {...}
  public void DomainMethod2() {...}
}
public class InternalDepartment : DepartmentBase
{
}
public class ExternalDepartment : DepartmentBase
{
}

甚至可以在 entity framework 核心中做到这一点吗?我找不到使用 FluentAPI 配置它的方法。谁能帮忙? 我也不确定在抽象 类 中使用抽象类型的嵌套属性实现域逻辑是否是个好主意。有没有更好的选择? 提前谢谢你!ent

Is it even possible to to that in entity framework core?

是的,文档在这里: https://docs.microsoft.com/en-us/ef/core/modeling/inheritance

I am also not sure if it is a good idea to implement domain logic in abstract classes with nested properties of abstract type as well. Is there any better alternative?

您将 DDD 实体(域模型)与 EF 实体(持久性模型)混淆了。

在具有嵌套抽象属性的抽象 class 中实现域逻辑不是问题。在 EF 模型中这样做有什么问题,因为它会给 object-relational 映射带来很大压力,尤其是当您有两个 back-end 数据库时。

ORM(例如 EF 核心)所做的是将对象上的操作转换为关系世界,并且 vice-versa。他们通常以尽可能少的内部逻辑操作POCO对象,因为它们是符号:它们代表,在对象世界中,数据库概念,如表、行、列、索引等...

如果您的应用程序是使用 domain-first 方法设计的,则可以使用相同的 business-persistence 模型。在那种情况下,ORM 只负责持久化域状态 as-is 并且数据库结构遵循 设计 域模型。但是,此模型可能会变得非常复杂,因为它必须同时对业务逻辑建模 并且 尊重数据库设计的良好实践。它仅在您的业务模型微不足道时才有效。

在这里,你对你的数据库结构(两个数据库)和一个复杂的域模型(abstract/polymorphism)有限制,所以你不能随意使用你的持久层一个简单的“保存我的域状态”图书馆。您应该将您的顾虑分成不同的模型:

  • 每个数据库一个持久性模型,具有贫乏的 POCO 并且没有抽象 classes 或属性
  • 一个具有抽象 classes 和属性的域模型,实现您的域逻辑

然后您可以使用存储库模式在模型之间实现适配器: