2011-09-13 9 views
0

別のクラスに格納されているクラスのリストを取得するのに問題があります。NHibernateでバッグをマッピングするときに、バッグの中のアイテムが保存されない

私はクラスの交差点を持っています。これは、ゾーンのリスト、別のクラスの鉱山を含む基本型のデバイスです。各交差点は複数のゾーンを持つことができますが、1つの交差点のみを特定のゾーンに割り当てることができます。

次のようにデバイス/交差点のための私のマッピングは次のとおりです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Devices.Device, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Device`" lazy="false"> 
<id name="PK" type="System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="PK" /> 
    <generator class="identity" /> 
</id> 
<many-to-one class="EMTRAC.Connections.Connection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="LocalConnection" lazy="false" cascade="all"> 
    <column name="LocalConnection_id" /> 
</many-to-one> 
<many-to-one class="EMTRAC.Connections.Connection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Connection" lazy="false" cascade="all"> 
    <column name="Connection_id" /> 
</many-to-one> 
<many-to-one class="EMTRAC.Packets.Packet, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Configuration" lazy="false" cascade="all"> 
    <column name="Configuration_id" /> 
</many-to-one> 
<joined-subclass name="EMTRAC.Intersections.Intersection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" lazy="false"> 
    <key> 
    <column name="Device_id" /> 
    </key> 
    <bag name="Zones" cascade="all-delete-orphan"> 
    <key> 
     <column name="Intersection_id" /> 
    </key> 
    <one-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
    </bag> 
    <many-to-one class="EMTRAC.Intersections.Streets, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Streets" lazy="false" cascade="all"> 
    <column name="Streets_id" /> 
    </many-to-one> 
    <many-to-one class="EMTRAC.Positions.Position, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Position" lazy="false" cascade="all"> 
    <column name="Position" /> 
    </many-to-one> 
</joined-subclass> 

とゾーンのクラスのための私のマッピングは次のとおりです。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Zone`" lazy="false"> 
<id name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="PK" /> 
    <generator class="identity" /> 
</id> 
<property name="Active" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="Active" /> 
</property> 
<property name="Dir" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="Dir" /> 
</property> 
<property name="IntID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="IntID" /> 
</property> 
<property name="Width" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <column name="Width" /> 
</property> 
<many-to-one class="EMTRAC.Headings.Heading, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Heading" cascade="all"> 
    <column name="Heading_id" /> 
</many-to-one> 
<many-to-one class="EMTRAC.Positions.Position, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Start" cascade="all"> 
    <column name="Start_id" /> 
</many-to-one> 
<many-to-one class="EMTRAC.Positions.Position, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Finish" cascade="all"> 
    <column name="Finish_id" /> 
</many-to-one> 

今、私がZoneオブジェクトを作成し、それを保存するとデータベースはすべて正常に保存され、Intersectionオブジェクトを参照するIntersection_Idフィールドは期待通りにnullです。しかし、このゾーンオブジェクトを交差点に追加して交差点を保存すると、その交差点は交差点にIntersection_idフィールドを介してリンクされず、交差点を読み込んでもゾーンリストにはゾーンが含まれません。

最初にゾーンを保存しないで交差点を保存すると、交差点は問題なく保存されますが、ゾーンは保存されません。

セッションのSQLを見ると、セーブ(交差点)では、ゾーンの保存を試みるために何も送信されません。私は交差点を保存した場合

また、その後、NHibernateのは、任意のSQLを実行していないと、ゾーンを保存しません

foreach(Zone z in intersection.Zones) session.Save(z);

を試してみてください。

これはおそらく私が紛失している小さなものです。何か案は?

EDIT

私は実際にこれに対する解決策を見つけました。これらのマッピングは実際には正しいか、少なくとも私はNHibernateがなぜこの解決策が働いたのかを知るには不十分であるが、何も彼らに間違いがないように見えるので、彼らがそうであると仮定している。とにかく、溶液は3倍であった。

まず、ゾーンを含むリストで交差を保存する前に、ゾーンが保存されていることを確認しなければなりませんでした。以下に説明するフラッシュを呼び出すときにゾーンを保存しないと、ゾーンを交差点にリンクしようとしたときにエラーが発生しますが、ゾーンのテーブルでゾーンレコードは検索されません。

これは、SessionがSessionであるSession.Save(zone)を呼び出すことによって実現されました。

ゾーンが保存された後、私は上記の方法を使用してセッションを保存しましたが、Session.Save(交差点)を呼び出しました。

問題を解決した最後のビットは、私が交差点を保存した後で、ISessionのSession.Flush()を呼び出して、ゾーンを交差点にリンクする必要がありました。

これで問題は解決し、すべてが保存され、ロードされ、正しくリンクされました。

バックグラウンドでISession.Flush()を実行すると、すべてをまとめて呼び出す必要があり、セッション全体を単純にSession.Save(intersection)呼び出しで保存しなかったのはなぜですか? ?

+0

マッピングを助けるかもしれないすべてのinverseに挿入されていないことを

は罰金です。例外はありますか? –

+0

いいえ、交差点を保存するときには交差点をゾーンに参照していないだけです。ゾーンを最初に保存しないと、ゾーンはゾーンテーブルにまったく保存されません。 –

+0

私はsession.Save(交差点)を呼び出すときに実行されているSQLを見て、NHibernateはゾーンをまったく保存または変更しようとしていません。何か案は? –

答えて

0

のアップデートと挿入は通常Session.Flush()でバッチ処理されますが、identityを使用しているため、NHはIDを生成するためにINSERTを発行する必要がありますが、アップデートをバッチします。パフォーマンスを向上させ、バッチ処理を可能にするために、他の主要な生成戦略(GUID、HiLo、...)があります。ゾーンは

<bag name="Zones" cascade="all-delete-orphan" inverse="true"> 
関連する問題