nhibernate - 如何在 Fluent NHibernate 中建模此对象层次结构而不违反 DDD 原则?

标签 nhibernate fluent-nhibernate domain-driven-design joined-subclass

我正在尝试构建一个允许我管理契约(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/

相关文章:

c# - 将投影添加到 nhibernate 查询

c# - ORM 存储库模式

nhibernate - 在 PreInsert/PreDelete 事件监听器中保存新实体不会持久保存到数据库

c# - 帮助使 Fluent NHibernate 为每个表创建一个 oracle 序列

jpa - 如何在 DDD 中实现 Vaughn Vernon 关于聚合中引用的建议

休眠延迟加载

nhibernate - 使用 NHibernate ICriteria/QueryOver 查询向外连接添加条件

c# - 使用 NHibernate 和 PostgreSQL 引用列名

domain-driven-design - 从事件存储中的事件流推断用户意图。这是正确的做法吗?

php - Symfony 2 中的 DDD - 如何与 Validator 服务交互?