我正在尝试构建一个允许我管理契约(Contract)的域模型。
Contract 类是我的聚合根,它现在有一个属性,即 Reviewers。
在契约(Contract)上下文中,每个审阅者都拥有其父契约(Contract)的属性以及名字、姓氏和登录名。他们拥有这些属性的原因是我可以让用户选择他们想要的契约(Contract)审阅者。
我将域模型绑定(bind)到的数据库已经存在,并且它是我正在尝试扩展的遗留系统。
它有一个契约(Contract)表和一个审阅者表。
到目前为止我还没有提到的是,审阅者实际上是系统中的用户。所以实际上涉及到第三个表,即 Users。
我已经能够使用 FNH 轻松映射我的契约(Contract)表。
它看起来像这样:
public class ContractMapping: ClassMap<Contract>
{
public ContractMapping()
{
Id(c => c.Id);
HasMany(c => c.AdditionalReviewers);
}
}
但我不确定如何为我的审阅者建模,因为他们实际上也是用户。所以我的对象模型如下所示:
public class Reviewer: User
{
public virtual Guid Id { get; set; }
public virtual Contract Contract { get; set; }
}
public class User
{
public virtual Guid Id { get; set; }
public virtual string Login { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
我已经能够正确映射我的 User 类,它看起来像这样:
public class UserMapping: ClassMap<User>
{
public UserMapping()
{
Id(u => u.Id);
Map(u => u.Login);
Map(u => u.FirstName);
Map(u => u.LastName);
}
}
我相信我想像这样映射我的 Reviewer 类:
public class ReviewerMapping: SubclassMap<Reviewer>
{
public ReviewerMapping()
{
Table("Reviewer");
//Id(r => r.Id).Column("ReviewerId"); <- won't compile
References(r => r.Contract).Column("ContractId");
}
}
所以我遇到的问题是:
用户表和审阅者表之间的关系是一对多。这意味着,对于给定的用户,可能有许多审阅者记录。为什么?因为用户必须是特定契约(Contract)的审阅者。但这会导致映射出现问题,因为我的审阅者的主键和我的用户的主键必然是完全不同的值。
此外,由于我使用审阅者的方式,当我创建新的审阅者时,我真正想做的是将用户与契约(Contract)关联起来。我不尝试在数据库中创建一个全新的用户。
知道在我的域模型中它是 User 的子类,映射 Reviewer 的正确方法是什么?
最佳答案
听起来审阅者实际上并不是在建模一个人,而是在建模用户所承担的角色或任务。我想说你的领域模型在这方面是有缺陷的。将 Reviewer 调整为用户和合约之间的关联类。
关于nhibernate - 如何在 Fluent NHibernate 中建模此对象层次结构而不违反 DDD 原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703246/