コントラクトを管理できるドメインモデルを構築しようとしています。
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をマップする正しい方法は何ですか?