我在獲取存儲在另一個類中的其中一個類的列表時遇到了一些麻煩。幫助使用NHibernate映射一個包,包中的物品不保存
我有一個Class Intersection,它是一個基本類型的設備,它包含我的另一個類的區域列表。每個交叉點可以有多個區域,但只能將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_Id字段引用Intersection對象爲空。但是,一旦將此區域對象添加到交叉路口並保存交叉路口,它不會通過Intersection_id字段將區域鏈接到交叉路口,並且加載交叉路口不包含區域列表中的任何區域。
如果我保存交叉路口而未先保存區域,則交叉路口可以很好地保存,但區域不會保存。
查看session.Save(交集)的SQL,我沒有看到任何被髮送來嘗試保存區域。
另外,如果我救了路口,然後嘗試
foreach(Zone z in intersection.Zones) session.Save(z);
NHibernate的不執行任何SQL,並且不保存區。
這可能是我錯過的小事。有任何想法嗎?
編輯
我居然找到了解決這個。映射實際上是正確的,或者至少我假設他們是因爲他們沒有看起來明顯的錯誤,雖然我不太瞭解NHibernate來確定這個解決方案爲什麼起作用。
無論如何,解決方案是三倍的。
首先,我必須確保在保存帶有包含區域的列表的交叉路口之前保存了區域。如果在調用Flush(如下所述)時未保存區域,則會在嘗試將區域鏈接到交點時發生錯誤,但未在區域的表格中找到區域記錄。
這是通過調用Session.Save(zone)來完成的,其中Session是一個ISession。
保存區域後,我使用上述方法保存了交點,但是調用了Session.Save(交集)。
解決問題的最後一點是我保存了交集後,我不得不爲ISession調用Session.Flush(),然後將該區域鏈接到交集。
這解決了這個問題,現在一切都被保存,加載並鏈接正確。
什麼是ISession.Flush()在後臺做需要我叫它把所有東西拼湊在一起,爲什麼它不是全部保存簡單地調用Session.Save(相交)與袋級聯集是一個問題?
映射似乎罰款。任何例外? –
不,它只是在保存交叉路口時沒有將交叉口引用到區域,並且如果我沒有先保存區域,則根本沒有將區域保存到區域表中。 –
當我調用session.Save(intersection)時,通過查看正在執行的SQL,NHibernate不會嘗試保存或更改Zone。有任何想法嗎? –