2

取得したいドメインは次のとおりです。

public class Person
{
    public int Id { get; set; }
    public IList<AcquiredCertificate> AcquiredCertificates { get; set; }
}

public class AcquiredCertificate
{
    public Person Acquirer { get; set; }
    public Certificate Certificate { get; set; }
    public DateTime DateAcquired;
}

public class Certificate
{
    public int Id { get; set; }     
}

そして、これは私が持っているスキーマです:

CREATE TABLE People (
    PersonId INT PRIMARY KEY
);

CREATE TABLE Certificates (
    CertificateId INT PRIMARY KEY
);

CREATE TABLE CertificatesAcquiredByPeople (
    PersonId INT,
    CertificatedId INT,
    DateAcquired DATETIME
);

これは不自然なスキーマとドメインですが、私が扱っているものとほとんど同じです。私は現在、CertificatesAcquiredByPeople テーブルを表す 3 番目のドメイン エンティティを作成することで機能していますが、それは本当に奇妙に思えます。

NHibernate を使用してこれをどのようにマップしますか? hbm ファイルのコンポーネント タグは、目的どおりに動作するはずですが、よくわかりません。

Certificate クラスに DateAcquired プロパティがあるため、私のドメインはおかしくなっていますか? 日付は、証明書を持っている人の関心事です。

[編集]

新しいエンティティが必要であることを反映するために、ドメイン モデルを変更しました。マッピングには 3 つの (エンティティごとに) マッピングが必要ですか、それとも 2 つ (個人と証明書の場合) で行うことができますか?

4

5 に答える 5

5

設計上、NHibernateは、多対多の関係を保持する中間(中央)テーブルに表されるFKのペア以外に絶対に何もない場合にのみ、暗黙の多対多マッピングをサポートします。

少し前に、Billy McCaffertyがこの正確な「問題」についてブログに書いています(BY DESIGN以来の問題ではありません)...

http://devlicio.us/blogs/billy_mccafferty/archive/2008/07/11/when-to-use-many-to-one-s-vs-many-to-many-with-nhibernate.aspx

于 2009-01-24T18:46:04.600 に答える
0

再:更新されたQ、3つのマッピングが必要になります。1対多の関係のペアに参加している3つのエンティティのそれぞれに1つずつです。

于 2009-01-24T18:55:46.547 に答える
0

あなたの実装は正確です。結合テーブルには 2 つのキー フィールド (テーブルの複合主キーを作成) が含まれており、datetime フィールドは不要です。実際、これは結合テーブルの追加の属性であり、そのためにはエンティティが必要です。

UML クラス図では、結合の属性としても表示されます。

于 2009-01-23T06:23:17.660 に答える
0

CertificatesAcquiredByPeople の名前を CertificatesAcquiredEvent のように変更
します (複数のキーと日時があることを意味します)。

NHibernateに関する限り、別のエンティティである必要があることに同意します。

于 2009-01-23T06:40:06.750 に答える