【发布时间】:2011-10-08 01:05:36
【问题描述】:
我正在尝试为 2 个类生成正确的映射,这些类在其中包含彼此的集合。
我目前有一个 Zone 和一个 Vehicle 类。 Zone 类包含包含该区域的车辆列表。 Vehicle 类包含包含 Vehicle 的区域列表。如您所见,这两个列表彼此直接相关。但是,在尝试保存我的一个对象时,我的映射一直给我一个外键约束错误。
谁能解释我做错了什么?
这是 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>
这是我对 Zone 类的映射:
<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 调用会抛出外键约束异常。我做错了什么?
【问题讨论】:
标签: nhibernate nhibernate-mapping