2

コントラクトを管理できるドメインモデルを構築しようとしています。

Contractクラスは私の集約ルートであり、現在、Reviewersという単一のプロパティがあります。

レビューアは、コントラクトのコンテキストでは、それぞれがその親コン​​トラクトのプロパティと、名、姓、およびログインを持っています。これらのプロパティがある理由は、ユーザーが契約に必要なレビュー担当者を選択できるようにするためです。

ドメインモデルを結び付けているデータベースはすでに存在し、それは私が拡張しようとしているレガシーシステムです。

契約テーブルとレビュー担当者テーブルがあります。

この時点まで私が言及していないことは、レビューアは実際にはシステムのユーザーであるということです。したがって、実際には3番目のテーブルであるUsersが関係しています。

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

レビュアークラスを次のようにマッピングしたいと思います。

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テーブルの関係は1対多です。つまり、特定のユーザーには、多くのレビュー担当者レコードが存在する可能性があります。なんで?ユーザーは特定の契約のレビュー担当者である必要があるためです。ただし、これにより、マッピングで問題が発生します。これは、レビュー担当者の主キーとユーザーの主キーが、必然的に完全に異なる値であるためです。

また、Reviewerの使用方法が原因で、新しいReviewerを作成するときに、実際に実行しようとしているのは、ユーザーをコントラクトに関連付けることです。データベースにまったく新しいユーザーを作成しようとはしていません。

ドメインモデルではUserのサブクラスであることを知っているので、Reviewerをマップする正しい方法は何ですか?

4

2 に答える 2

2

レビュー担当者は実際には人をモデル化していないように聞こえますが、ユーザーが引き受ける役割または割り当てをモデル化しています。あなたのドメインモデルはこの点で欠陥があると思います。Reviewerを、ユーザーとコントラクト間の関連付けクラスになるように調整します。

于 2010-09-13T18:27:57.887 に答える
1

あなたが説明したシナリオでは、レビュアーはユーザーから継承すべきではないと思います。代わりに、ReviewerクラスにUserオブジェクトを保持させます(継承に対する構成)。

概念化に役立つ場合は、Reviewerの名前をReviewに変更します。そうすれば、実際にはそうではないので、ユーザーとして考えるのをやめることができます(現在のドメイン内の複数のレビュー担当者が同じユーザーになる可能性があり、あまり意味がありません)。

于 2010-09-13T18:34:51.757 に答える