我試圖爲2個類生成正確的映射,它們之間有彼此的集合。NHibernate雙向多對多映射的2個列表
我目前有一個Zone和一個Vehicle類。 Zone類包含一個包含區域的車輛列表。 Vehicle類包含一個包含車輛的區域列表。正如你所看到的,這兩個列表直接相關。但是,當我試圖保存我的一個對象時,映射不斷給我一個外鍵約束錯誤。
有人可以解釋我做錯了什麼嗎?
下面是汽車類的映射:
<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`">
<id name="PK" type="System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="PK" />
<generator class="identity" />
</id>
<version name="LastModifiedOn" column="LastModifiedOn" type="timestamp" access="field.pascalcase-underscore" />
<joined-subclass name="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
<key>
<column name="Device_id" />
</key>
<component name="Zones" access="property">
<bag name="_list" cascade="save-update" access="field" table="VehicleZones">
<key>
<column name="Veh_id"/>
</key>
<many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
<property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</property>
</joined-subclass>
</class>
</hibernate-mapping>
這裏是我的區類的映射:
<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`">
<id name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="PK"/>
<generator class="identity" />
</id>
<version name="LastModifiedOn" column="LastModifiedOn" type="timestamp" access="field.pascalcase-underscore" />
<property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</property>
<component name="Vehicles" access="property">
<bag name="_list" cascade="save-update" access="field" table="VehicleZones" inverse="true">
<key>
<column name="Zone_id" not-null="false"/>
</key>
<many-to-many class="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
</class>
</hibernate-mapping>
我通過保存的區域和車輛:
using (var session = _sessionFactory.OpenSession())
{
foreach (Zone zone in Program.data.Zones.list)
{
session.SaveOrUpdate(zone);
}
foreach (Vehicle veh in Program.data.Vehicles.list)
{
session.SaveOrUpdate(veh);
}
}
之後,我將區域添加到車輛列表和車輛到區域列表,然後我嘗試通過以下方式保存列表:
using (var session = _sessionFactory.OpenSession())
{
foreach (Zone zone in Program.data.Zones.list)
{
foreach (Vehicle veh in Program.data.Vehicles.list)
{
veh.Zones.Add(zone);
zone.Vehicles.Add(veh);
}
}
using (var tx = session.BeginTransaction())
{
foreach (Vehicle veh in Program.data.Vehicles.list)
{
session.Update(veh.Zones);
}
tx.Commit();
}
}
此時Commit調用引發外鍵約束異常。我究竟做錯了什麼?