質問

NHibernate noobはこちら。次の一般的なシナリオのマッピング方法に関するアドバイスを探しています。

[ストア]
id pk
名前

[StockItem]
id pk
名前

[StockItemStore]
id pk
StockItemId fk
StoreId fk
ParLevel

AssignToStore(Store store)メソッドを使用して、StockItemエンティティを介してさまざまなStockItemをさまざまなストアに割り当てることができるドメインモデルを作成しました。

現在、nhibernateを使用してdbスキーマを作成しています。この基本的なシナリオのマッピングファイルを設定するにはどうすればよいですか

ヒントは大歓迎です。

Chev

役に立ちましたか?

解決

残念ながら、この関係はnHibernateでモデル化するのが最も簡単なものではなく、リンクテーブルのデータに対してクエリを実行しようとすると固有の問題がいくつか発生します。セットアップは非常にうまくいきます。

これに対する私のアプローチは、Storeマッピングでは次の関係、StockItemマッピングでは逆の関係を持つ2つの多対1マッピングとして設定することです。

<bag name="StockItems" table="StockItemStore" lazy="true">
  <key column="StoreId" />
  <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components">
    <property name="ParLevel" type="Int32" />
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" />
  </composite-element>
</bag>

Storeクラスには次のコレクションがあります:

public virtual IList< StockItemStore > StockItems {get;set;}

そしてStockItemは再び逆になります:

public virtual IList< StockItemStore > Stores {get;set;}

StockItemStoreオブジェクトには、オブジェクト(StoreまたはStockItem)とリンクテーブルにある追加情報を含めることができます。 (この場合はParLevelのみです。

StoreまたはStockItemからStockItemStoreオブジェクトを見ている側に応じてnullになります。 2つのクラスに分けることができますが、このアプローチを使用する方が簡単です。開発者として、どちらからアプローチするかを知る必要がありますが、私の意見ではコードをよりシンプルで再利用可能にするための良いトレードオフです

public class StockItemStore
{
    private StockItem stockItem;
    private Store store;

    public virtual StockItem StockItem
    {
        get
        {
            if (stockItem == null)
            {
                stockItem = new StockItem();
            }

            return stockItem;
        }
        set
        {
            stockItem = value;
        }
    }

    public virtual Store store
    {
        get
        {
            if (store == null)
            {
                store = new Store();
            }

            return store;
        }
        set
        {
            store = value;
        }
    }

    public virtual int ParLevel { get; set; }

}

私のアプローチでは、質問で定義したStockItemStoreの単一の一意の識別子ではなく、リンクテーブルの複合キーを使用します。しかし、それは全体的に過去に私に役立っています。本当に必要な場合は、何らかの方法でそのIDをシューホーンできると確信しています。

このアプローチは、HQLを使用したクエリに最適です。 ICriteriaクエリを使用しようとすると、少し不安定になる傾向があります。データベースビューを使用して、クエリに使用する別のテーブルをシミュレートするいくつかの解決策がありますが、私にとっては有効です。

ICriteriaクエリを実行する必要がある場合はお知らせください。サンプルコードを投稿できます。

  • 最大

他のヒント

nHibernateを読むことを強くお勧めします。非常に良い出発点は次のとおりです。

nHibernate FAQ

最初の数回は手動でマッピングを行うこともお勧めします。その後、Fluent nHibernateをチェックアウトする必要があります。 Fluent nHibernateは(とりわけ)ドメインモデルから自動的にマッピングを生成し、データベーススキーマの生成を支援します。これは非常に柔軟なツールであり、どんどん良くなっています。ここにあります:

Fluent nHibernate

がんばって!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top