1

Property、Business、Automobile の 3 つのテーブルを Utility という名前の単一のテーブルにポイントしたい。Fluent NHibernateを使用して、フォローしました

    public UtilityMap()
    {
        // some Mappings
        References<Automobile>(x => x.Automobile, "LeaseRefId").Cascade.None();
        References<Business>(x => x.Business, "LeaseRefId").Cascade.None();
        References<Property>(x => x.Property, "LeaseRefId").Cascade.None();
    }

そして、ユーティリティにマップされる各テーブルで、私は従いました

    public AutomobileMap()
    {
        //Some Mappings

        HasOne<Utility>(x => x.CommonDatas)
            .Cascade.All();
    }

「ユーティリティ テーブルに、3 つすべての (自動車、ビジネス、プロパティ) テーブルの参照を格納できる単一の列が必要です。しかし、流暢な Nhibernate は、参照されるテーブルごとにキー列を作成しています。これを避けたいのです。 "

これを達成する方法はありますか?? 事前に感謝を提案してください。

4

1 に答える 1

1

これが期待どおりに機能するには、AutomobileBusinessおよびPropertyクラスの基本クラスが必要です。と呼びましょうLeaseSubject。おそらく、あなたのドメイン モデルにはすでにそのようなものがあります。

Utility クラスには、現在の 3 つのプロパティではなく、1 つのプロパティのみを含める必要があります。

public virtual LeaseSubject LeaseSubject { get; set; }

このようにして、マッピングが簡単になるだけでなく、コードの保守性も向上します。後でリース サブジェクトをもう 1 つ持つことにした場合、つまりYacht? Utility クラスに別のプロパティを追加する代わりに、Yachtから継承するだけでよく、クラスのプロパティLeaseSubject内に含めることができます。LeaseSubjectUtility

これで、ユーティリティを次のように簡単にマップできます。

public UtilityMap() 
{
    // Other mappings...
    References(x => x.LeaseSubject, "LeaseRefId");
}

Automobile、Business、および Property クラスをマッピングするには、利用可能な 3 つの NHibernate継承戦略のいずれかを使用します。

  • クラス階層ごとのテーブル
  • サブクラスごとのテーブル
  • 具体的なクラスごとのテーブル

FluentNHibernate の継承マッピングについては、こちらをご覧ください。

あなたはすでに別々のテーブルを持っているので、あなたの場合の正しい戦略は具象クラスごとのテーブルになると思います。詳細については、この記事を参照してください。

于 2012-06-10T00:06:28.527 に答える