我正在嘗試一個多對多的列表中的一個對象。NHibernate映射多對多的列表不加載對象的權利
我有三個類,我試圖通過NHibernate保存和加載:交叉點,車輛和區域。交叉路口和車輛均來自設備。
交集類包含區域列表,每個區域可能只屬於1個交點,但每個交點可以包含多個區域。我已經正確地映射了它,並且將區域的多對一關聯保存到交叉路口就好了。
車輛類包含一個區域列表。車輛可能屬於多個區域。另外,區域包含車輛列表。每個區域可能包含多個車輛。因此兩者之間的多對多關係。
所有對象似乎都正確保存到數據庫中。我可以瀏覽我的表格,並且每個交叉點,車輛和區域的所有字段都可以正確傳播;但是,當我使用NHibernate加載對象時,它們不會加載字段。
我希望有人能夠對這裏可能出現的問題有所瞭解。
這裏是我的設備的映射,其中包括在路口和汽車類的映射:
<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>
<component name="Zones" access="property">
<bag name="_list" cascade="all-delete-orphan" access="field" lazy="false" fetch="join">
<key>
<column name="Zone_PK" />
</key>
<many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
<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>
<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="all-delete-orphan" access="field" lazy="false" table="VehicleZones" inverse="false">
<key>
<column name="Vehicle_PK" />
</key>
<many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
<property name="Active" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Active" />
</property>
<property name="Status" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Status" />
</property>
<property name="Velocity" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Velocity" />
</property>
<property name="Heading" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Heading" />
</property>
<property name="Agency" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Agency" />
</property>
<property name="Unit" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Unit" />
</property>
<property name="Priority" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Priority" />
</property>
<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_id" />
</many-to-one>
<many-to-one class="EMTRAC.VehicleClasses.VehicleClass, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="VehClass" lazy="false" cascade="all">
<column name="VehClass_id" />
</many-to-one>
</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`" 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>
<property name="Distance" type="System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Distance" />
</property>
<many-to-one class="EMTRAC.Headings.Heading, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Heading" cascade="all-delete-orphan">
<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-delete-orphan">
<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-delete-orphan">
<column name="Finish_id" />
</many-to-one>
<component name="Vehicles" access="property">
<bag name="_list" cascade="all-delete-orphan" access="field" lazy="false" table="ZoneVehicles" fetch="join" inverse="true">
<key>
<column name="Zone_PK" />
</key>
<many-to-many class="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bag>
</component>
</class>
</hibernate-mapping>
最後這裏是我的車和園區類:
public class Vehicle : Device
{
#region Fields
protected bool active;
protected int id;
protected Position position = new Position();
protected int status;
protected VehicleClass vehClass;
protected int velocity;
protected int heading;
protected string agency;
protected string unit;
protected int priority;
private ZoneCollection zones = new ZoneCollection();
#endregion
#region Properties
[Browsable(false)]
public virtual long PK { get; set; }
[Browsable(false)]
public virtual bool Active
{
get { return active; }
set { active = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("Vehicle Identification Number")]
public virtual int ID
{
get { return id; }
set { id = value; }
}
[Browsable(false)]
public virtual Position Position
{
get { return position; }
set { position = value; }
}
[Browsable(false)]
public virtual int Status
{
get { return status; }
set { status = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("This is the type of vehicle.")]
public virtual VehicleClass VehClass
{
get { return vehClass; }
set { vehClass = value; }
}
[Browsable(false)]
public virtual int Velocity
{
get { return velocity; }
set { velocity = value; }
}
[Browsable(false)]
public virtual int Heading
{
get { return heading; }
set { heading = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("This is the name of the city agency that owns the vehicle.")]
public virtual string Agency
{
get { return agency; }
set { agency = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("This is the ID number assigned to the vehicle by the city or agency and is also used for identification purposes. This field accepts both alpha and numeric entries.")]
public virtual string Unit
{
get { return unit; }
set { unit = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("This is the priority level that the vehicle has over other vehicles with priority control capabilities (1 being the highest, 5 being the lowest). This is not the same as the priority control levels assigned to emergency vehicles (priority 1 for EVP) and mass-transit vehicles (priority 2 for TSP).")]
public virtual int Priority
{
get { return priority; }
set { priority = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("Zones associated with the Vehicle.")]
[System.ComponentModel.Browsable(true)]
[System.ComponentModel.Editor(typeof(VehicleCollectionModalEditor), typeof(System.Drawing.Design.UITypeEditor))]
public virtual ZoneCollection Zones
{
get { return zones; }
set { zones = value; }
}
[Browsable(false)]
public virtual string IPLocal
{
get
{
if (LocalConnection.GetType() == typeof(Connections.ConnectionSerial))
{
return (
((Connections.ConnectionSerial)LocalConnection).SerialConn.PortName + " :: " +
((Connections.ConnectionSerial)LocalConnection).SerialConn.BaudRate.ToString()
);
}
else if (LocalConnection.GetType() == typeof(Connections.ConnectionTCP))
{
return (
((IPEndPoint)((Connections.ConnectionTCP)LocalConnection).Client.Client.RemoteEndPoint).Address.ToString() + " :: " +
((IPEndPoint)((Connections.ConnectionTCP)LocalConnection).Client.Client.RemoteEndPoint).Port.ToString()
);
}
else
{
return string.Empty;
}
}
}
[Browsable(false)]
public virtual string IPNetwork
{
get
{
if (Connection.GetType() == typeof(Connections.ConnectionSerial))
{
return (
((Connections.ConnectionSerial)Connection).SerialConn.PortName + " :: " +
((Connections.ConnectionSerial)Connection).SerialConn.BaudRate.ToString()
);
}
else if (Connection.GetType() == typeof(Connections.ConnectionTCP))
{
return (
((IPEndPoint)((Connections.ConnectionTCP)Connection).Client.Client.RemoteEndPoint).Address.ToString() + " :: " +
((IPEndPoint)((Connections.ConnectionTCP)Connection).Client.Client.RemoteEndPoint).Port.ToString()
);
}
else
{
return string.Empty;
}
}
}
#endregion
}
public class Zone
{
#region Private Fields
private bool active;
private string dir;
private Heading heading = new Heading();
private int id;
private int intID;
private Position start = new Position();
private Position finish = new Position();
private int width;
private Position[] corners = new Position[4];
private Streets streets = new Streets();
private VehicleCollection vehicles = new VehicleCollection();
private double distance;
#endregion
#region Constructors
public Zone()
{
if (Program.main != null)
{
IntID = Program.main.intID;
Intersection intersection = Program.data.Intersections.list.Find(
delegate(Intersection tInt)
{
return tInt.ID == IntID;
}
);
if (intersection != null)
{
Streets.Crossing = intersection.Streets.Crossing;
Streets.Route = intersection.Streets.Route;
}
}
}
#endregion
#region Properties
[Browsable(false)]
public virtual long PK { get; set; }
[Browsable(false)]
public virtual bool Active
{
get { return active; }
set { active = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The direction for the Zone.")]
public virtual string Dir
{
get { return dir; }
set { dir = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("This is the amount of heading variance (clockwise and counter-clockwise) in actual degrees.")]
public virtual Heading Heading
{
get { return heading; }
set { heading = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The Zone Identification Number.")]
public virtual int ID
{
get { return id; }
set { id = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The Identification Number associated with the Priority Detector of the Zone.")]
public virtual int IntID
{
get { return intID; }
set { intID = value; }
}
[CategoryAttribute("Position"),
DescriptionAttribute("The location of the Zone's Start.")]
public virtual Position Start
{
get { return start; }
set { start = value; }
}
[CategoryAttribute("Position"),
DescriptionAttribute("The location of the Zone's Finish.")]
public virtual Position Finish
{
get { return finish; }
set { finish = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The width of the Zone.")]
public virtual int Width
{
get { return width; }
set { width = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The distance of the Zone.")]
public virtual double Distance
{
get { return distance; }
set { distance = value; }
}
[Browsable(false)]
public virtual Position[] Corners
{
get { return corners; }
set { corners = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("The streets associated with the Zone."),
DisplayName("Zone Streets")]
public virtual Streets Streets
{
get { return streets; }
set { streets = value; }
}
[CategoryAttribute("Configuration"),
DescriptionAttribute("Vehicles associated with the Zone.")]
[System.ComponentModel.Browsable(true)]
[System.ComponentModel.Editor(typeof(VehicleCollectionModalEditor), typeof(System.Drawing.Design.UITypeEditor))]
public virtual VehicleCollection Vehicles
{
get { return vehicles; }
set { vehicles = value; }
}
#endregion
}
我敢肯定,這可能是一些真正的小我思念ING。有任何想法嗎?
其實,深入研究這個看起來好像不是加載ID屬性,這可能是唯一沒有正確保存的東西。它似乎將我的ID保存爲Device_id,並且當我使用NHibernate加載對象時,它不會加載ID屬性。有任何想法嗎? –
無所謂的ID。我忘了將ID屬性添加到類映射中。但是,在加載交叉路口時,交叉口中的區域列表包含所有區域,但區域包含的車輛列表爲空。 –