2011-09-29 34 views
0

我正在嘗試一個多對多的列表中的一個對象。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。有任何想法嗎?

+0

其實,深入研究這個看起來好像不是加載ID屬性,這可能是唯一沒有正確保存的東西。它似乎將我的ID保存爲Device_id,並且當我使用NHibernate加載對象時,它不會加載ID屬性。有任何想法嗎? –

+0

無所謂的ID。我忘了將ID屬性添加到類映射中。但是,在加載交叉路口時,交叉口中的區域列表包含所有區域,但區域包含的車輛列表爲空。 –

回答

1

1)您的多對多表缺少外鍵定義。外鍵將由NH生成,但雙方必須相同,所以它不起作用。

例如。

  <many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> 
      <column name="Zone_PK"/> 
      </many-to-many> 

2)袋子映射使用fetch="join"這不是一個好主意。

+0

謝謝,知道這可能是我只是俯視的小東西。當你一直盯着xml映射的牆壁連續幾周時,很難抓住這些東西。感謝幫助。 –