2012-03-14 13 views
3

プロパティの1つにPhotosプロパティ(IListタイプ)が含まれているUserオブジェクトがあります。Nhibernate - 依存テーブルでオブジェクトを保存する

SQLデータベース内のテーブルは、外部キーによって結合されます。すなわち

表ユーザー{長いNULL NOTユーザーID .......} 表UserPhoto {PHOTOID長いNULL NOT、ユーザーID長くないヌル参照[ユーザー] .UserId ........}

したがって、対応するUser行がないと、userphotoに行を挿入することはできません。

私ができることをしたいのは、コード内にUser Objectを構築し、UserPhotoオブジェクトのIlistを追加することです(Userオブジェクトは保存されていないので、必ず空白のユーザーIDが必要です)。身元はまだ挿入によって作成された)

<class name="User" table="[User]"> 
    <id name="UserId" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <bag name="Photos" order-by="DisplayOrder asc" cascade="all">  
     <key column="UserId" /> 
     <one-to-many class="UserPhoto" /> 
    </bag> 
</class> 
<class name="UserPhoto" table="UserPhoto"> 
    <id name="PhotoId" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <property name="UserId" /> 
</class> 

を次のように

私のマッピングがあるしかし、私は試してみて、NHibernateはSession.Save(ユーザー)を持つユーザオブジェクトを保存するとき、それは外部キー制約が失敗したというエラーがスローされます。だから私は、ユーザーテーブルの前にリスト内のユーザーの写真を挿入しようとしているか、または新しく生成されたユーザーIDプロパティを写真に設定せず、nullユーザーIDで保存しようとしています。

これは外部キー列で、それが適用されることを示すためにマッピングに何か追加する必要がありますか?nhibernateは依存する行を正しい順序で挿入する方法を知っていますので、 ?

答えて

1

はこれを試してください:写真のバッグに加え、真

<class name="User" table="[User]"> 
    <id name="UserId" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true">  
     <key column="UserId" /> 
     <one-to-many class="UserPhoto" /> 
    </bag> 
</class> 
<class name="UserPhoto" table="UserPhoto"> 
    <id name="PhotoId" column="Id"> 
     <generator class="identity" /> 
    </id> 
    <many-to-one name="User" property-ref="UserId" column="UserId"/> 
</class> 

インバース=

http://bchavez.bitarmory.com/archive/2007/10/06/nhibernate-and-inversetruefalse-attribute.aspx

はまた、あなたは

+0

リンクありがとうございました。あなたが投稿したリンクからまだエラーが出ていますが、私はの子の宣言にマッピングが必要な印象を受けていますか?上記のUserPhoto宣言が表示された場合は、UserIdをプロパティとしてマッピングするだけです。これは問題ですか? FKの関係について知るためにUserPhoto宣言で何をする必要がありますか?私はUserId上でPlain Many to Oneを実行しようとしましたが、「UserPhotoテーブルからの関連付けはマップされていないクラスを参照しています:System.Int32」 – NZJames

+0

inverse = trueを使用すると、コード内の関係を管理する必要があります。詳細は私の答えです。 –

+0

私は答えを更新しました。 UserIdのプロパティリファレンスを多対1ユーザーマッピングに変更し、UserPhotoクラスを – reach4thelasers

0

多対一のユーザ要素にユーザーID要素を変更しましたバッグにinverse="true"を追加する必要があります。そうでない場合は、NHibernateは挿入後、更新を行います。

<bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true">  
    <key column="UserId" /> 
    <one-to-many class="UserPhoto" /> 
</bag> 
0

あなたのいずれかがフォトコレクション

<bag name="Photos" order-by="DisplayOrder asc" cascade="all" inverse="true"> 

のマッピングに逆=「true」を追加する必要があります。また、写真のテーブルにユーザーID列のNULL可能を行う必要があります。

最初のオプションを行う場合は、オブジェクト間の関係を自分で設定する必要があります。

var user = new User(); 
var photo = new Photo(); 
photo.User = user; 
user.Photos.Add(photo); 

逆=「true」をセットして、NHは、ユーザーを挿入する識別情報に基づいてユーザーIDを更新します値を入力し、それぞれの写真を挿入した写真テーブルにuseridを設定して挿入します。

NHはinverse = "true"を設定しないと、nullのユーザーIDで写真を挿入し、挿入された写真のすべての写真IDを選択してから、その後にユーザーIDを設定するための更新を発行します。これにより、追加のSQL文が生成されます。

関連する問題