2

我正在尝试构建一个允许我管理合同的域模型。

Contract 类是我的聚合根,它现在只有一个属性,即 Reviewers。

审阅者,在合同的上下文中,每个人都有其父合同的属性,以及名字、姓氏和登录名。他们拥有这些属性的原因是我可以让用户在合同中选择他们想要的审阅者。

我将域模型绑定到的数据库已经存在,并且它是我正在尝试扩展的遗留系统。

它有一个合同表和一个审阅者表。

到目前为止我还没有提到,审稿人实际上是系统中的用户。所以实际上涉及到第三个表,即用户。

我已经能够使用 FNH 轻松映射我的合同表。

它看起来像这样:

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");
    }
}

所以我遇到的问题是:

User 表和 Reviewer 表之间的关系是一对多的。这意味着,对于给定的用户,可能有许多 Reviewer 记录。为什么?因为用户必须是特定合同的审阅者。但是,这会导致映射出现问题,因为我的 Reviewer 的主键和我的 User 的主键是完全不同的值,这是必要的。

此外,由于我使用 Reviewer 的方式,当我创建一个新的 Reviewer 时,我真正想做的是将用户与合同相关联。我不想在数据库中创建一个全新的用户。

知道在我的域模型中它是 User 的子类,我映射 Reviewer 的正确方法是什么?

4

2 回答 2

2

听起来,Reviewer 并不是真正为人建模,而是为用户承担的角色或任务建模。我想说您的域模型在这方面存在缺陷。将 Reviewer 调整为 User 和 Contract 之间的关联类。

于 2010-09-13T18:27:57.887 回答
1

I don't think Reviewer should inherit from User in the scenario you've described. I would have the Reviewer class hold a User object instead (composition over inheritance).

If it helps you conceptualize it better, rename Reviewer to Review. That way you can stop thinking about it as a User since it really isn't (multiple Reviewers in your current domain can be the same User, which doesn't make much sense).

于 2010-09-13T18:34:51.757 回答