2

私は、マッピングを介して親オブジェクトにオブジェクトのコレクションを取得しようとしています。プライマリキーなしで子をフェッチするNHibernate

主キーがguid(Id)で、主キーがguid(Id)である子「Score」オブジェクトの親オブジェクト「ScoreCard」があります。私は両方のオブジェクトが持つ2つのフィールドに基づいて、親の子オブジェクトを選択したいが、私はそれを動作させることはできません、ここでのマッピングが

<bag name="ScoreCard"> 
    <key> 
    <column name="HoleId"/> 
    <column name="PlayerId"/> 
    </key> 
    <one-to-many class="Score" not-found="ignore"/> 
</bag> 

だ私は、データベースを設計しなかったが、スコアカードオブジェクトが来ます私が必要とする列と悪い指導者の両方を返すビューから。何を試しても、NHibernateは、主キーと同じではない外部キーに関する例外をスローし続けます。

これは私には最も単純な要件であると思われますが、いくつかの基準が与えられたもののコレクションを取得するのはなぜですか?

ご迷惑をおかけして申し訳ありませんが、悪い例のコード(親戚の家での潜在的なゴルフ観戦)。

答えて

3

まあ、私はそれが最終的に見つかりました。親オブジェクトは、3つの列とキーなしのビューから描画されます。私はコードを見たときに見つけた悪いguidの代わりに、複合キーをHoleIdとPlayerIdにマップすることができます。これは、私が必要とするScoreオブジェクトを簡単にマップし、NHibernateUtil.Initializeを使ってそれらを怠惰に読み込むことができるのですばらしいです。

マイマップXMLは、私がthis postからインスピレーションを得たこの

<class name="ParentObject"> 
    <composite-id> 
     <key-property name="HoleId" column="HoleId" /> 
     <key-property name="PlayerId" column="PlayerId" />  
    </composite-id> 
    <property name="EvilGuid" column="Id" /> 
    <bag name="ScoreCard"> 
     <key> 
     <column name="HoleId"/> 
     <column name="PlayerId"/> 
     </key> 
     <one-to-many class="Score" not-found="ignore"/> 
    </bag> 
</class> 

のように見える必要があり、私は私がここに幸運を持っていた感じ、デザインが良く作ることができるよう、また、ステファンの答えに注意を払ってください。 DDDについてもっと考える

ありがとうございました。

+0

これは魅力的に機能しました。ありがとう – cabhishek

1

問題はこれです:NHibernateはDDDのために最適ですが、ドメインクラスを作成してデータベースをドメインモデルに最適にすることを意味します。

非プライマリキーフィールドと複合ID関係があります。だから、NHibernateがそれに対処できるように祈り始めてください。複合IDと非プライマリキーによるリレーションシップの両方がサポートされています(レガシーデータベースの場合)。また、DDDの場合は一般的に推奨されません。

両方の組み合わせがうまくいかないと思います。 NHibernatesの問題追跡ツールのこの問題を参照してください: https://nhibernate.jira.com/browse/NH-1722。その地物に投票することができます。

+0

ありがとう、複合外部キーの複合キーを使って作業する例がありますが、必要なプロパティrefであることがわかります。 ORMがデータベースの設計を決定するのはとても難しいようですが、DDDに関するあなたの意見を見ることができるので、まだチャンスがある間は再設計を検討するかもしれません。 –

+0

NHibernateは、ドメインモデルにできるだけ近づかないように指示し、これをかなりうまくやっています(少なくとも他のどの方法よりも優れています)。あらゆる種類のリレーショナル・モデルをサポートすることで、おそらく約90%しかカバーしていません。どの列の値でも行をリンクするのはまれで、クラス・モデルにはマッピングが難しいです。リレーショナルモデルははるかに柔軟性があります。 –

+0

ええ、私はオブジェクトにデータを取得するためにprocsを使用することに慣れているので、私が望むどのカラムでも他のテーブルに簡単に結合できます。私はこれがテーブル間の関係を作成するのと同じではないことを理解しているので、データベースを変更します。これがどのように再生するかを見て、私は今とても悪くはないと思うし、それは私がより良いデザインを提供する。 –

関連する問題