我试图为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调用引发外键约束异常。我究竟做错了什么?