C# 域实体中的外键属性

C# 域实体中的外键属性,c#,entity-framework,domain-driven-design,repository-pattern,poco,C#,Entity Framework,Domain Driven Design,Repository Pattern,Poco,在域驱动的设计中,域模型应该完全不知道任何数据持久性细节 假设员工属于部门。域实体可以如下所示: public Employee { public string EmployeeId { get; set; } public string FirstName { get; set; } public string LastName{ get; set; } public Department Department { get; set; } public

在域驱动的设计中,域模型应该完全不知道任何数据持久性细节

假设
员工
属于
部门
。域实体可以如下所示:

public Employee
{
    public string EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName{ get; set; }
    public Department Department { get; set; }
    public int DepartmentId { get; set; }
}

public Department
{
    public string DepartmentId { get; set; }
    public string Name{ get; set; }
}
员工.部门ID
在域模型中真正相关,还是这是基础架构存储详细信息?

当然
Employee.Department
这一级别的关系很重要吗


在我的例子中,这些实体将存储在SQL数据库中,数据将由实体框架检索,因此数据库中将存在
Employee.DepartmentId
列。

如果使用外键,实体框架中的生活会更轻松:

您完全正确地说,外键实际上与域模型无关。它是持久性模型的一部分

所以你需要决定加入哪个阵营。你是纯粹主义者还是实用主义者?是否有单独的域模型和持久性模型


这里的问题是,您正在使用主键(数据库概念)作为域模型中的对象标识。实体应具有在模型中定义的自然/代理标识-例如,这可以是guid。这将用于查询存储库。数据库行id只是持久性平台的一个实现细节。为什么与域模型“不相关”?我可以理解为什么FK特别不合适,因为它是一个持久性问题。但在现实世界中,员工和部门之间肯定存在着某种关系。DDD的一个关键原则是在模型中准确反映领域。因此,我希望在模型中看到一些东西来表示这种关系。FK不是这种关系的派生产物吗?抱歉,我设法错过了代码中的“Department”属性。没有这一点,我就不知道在缺乏FKs的情况下如何对rel进行建模。现在说得通了,对不起,噪音太大了。是否更容易还是有点主观。某些方面在某些情况下更容易,而其他方面则更难。如今,附加现有实体的需求往往只限于少数情况,Web应用程序在.Net开发中占据了最大份额。使用LoadEntity()扩展方法可以减少99%的情况,并允许更干净、因此更易于维护的域模型。