2

私たちは、Network と State の組み合わせに基づいて MemberAgreement が異なるという要件があるドメインに取り組んでいます。MemberAgreement には、ネットワークの複数の状態で共有できるテンプレートがあります。

エンティティをモデル化する方法は次のとおりです。

public class MemberAgreement
{
        public Network Network { get; protected set; }
        public List<State> States { get; protected set; }
        public Template Template {get; protected set; }
}

テーブルは次のように設計されています。

Agreement
---------
Id
NetworkId
StateId
TemplateId

このテーブルでは、NetworkId と TemplateId を異なる StateId に対して繰り返すことができます。

では、これを Fluent NHibernate でどのようにマッピングすればよいでしょうか? Network と State の間には 1 対多の関係があり、これら 2 つの組み合わせは Template との多対多の関係にあります。

助けていただければ幸いです。

パソコン

4

1 に答える 1

1

テーブル構造をそのまま使用MemberAgreementすると、オブジェクト定義を変更する必要があります。すべての行(IDで一意)は、正確に1つのReferenceTypeを参照しています。

public class MemberAgreement
{
  public virtual Network Network { get; protected set; }
  //  public List<State> States { get; protected set; }
  public virtual State State { get; protected set; }
  public virtual Template Template {get; protected set; }
}

これにより、マッピングが簡素化されReferences(x => x.State)ます。ただし、コレクションを操作する必要があるビジネスレイヤーでは、さらに多くの問題が発生しますIList<MemberAgreement>

他のオプションは6.9を使用することです。三元協会。抽出され、ネットワークに適用されます。

public class Network
{
  ...
  public virtual IDictionary<State, Template> StateTemplates { get; set; }
}

<map name="States" table="Agreement" >
    <key column="NetworkId" />
    <index-many-to-many column="StateId" class="State" />
    <many-to-many column="TempalteId" class="Template" />
</map>

そしてこのように流暢に:

HasMany(x => x.StateTemplates)
    .KeyColumn("NetworkId")
    .AsMap<State>("StateId")
    .AsTernaryAssociation("TemplateId");
于 2013-01-24T06:03:29.863 に答える