Nhibernate 从串行连接本身而不是我的属性。这是有道理的。我自己也不会抓到那个。 [ComVisible(true)] [TypeConverter(typeof(ExpandableObjectConverter))] public class Device {

Nhibernate 从串行连接本身而不是我的属性。这是有道理的。我自己也不会抓到那个。 [ComVisible(true)] [TypeConverter(typeof(ExpandableObjectConverter))] public class Device { ,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,从串行连接本身而不是我的属性。这是有道理的。我自己也不会抓到那个。 [ComVisible(true)] [TypeConverter(typeof(ExpandableObjectConverter))] public class Device { #region Fields private PacketMutexQueue PacketIn = new PacketMutexQueue(100, 5000); private PacketMutexQueue Pa

从串行连接本身而不是我的属性。这是有道理的。我自己也不会抓到那个。
[ComVisible(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class Device
{
    #region Fields

    private PacketMutexQueue PacketIn = new PacketMutexQueue(100, 5000);
    private PacketMutexQueue PacketOut = new PacketMutexQueue(100, 5000);
    private bool wantLocal = false;
    private Connection localConnection = new Connection();
    private Connection connection = new Connection();
    private Thread packetfactorythread;
    private Dispatcher dispatcher;
    private MutexBindingList<PD_Log> logs = new MutexBindingList<PD_Log>();
    protected Packet configuration;
    private ConfigurationCache configurationCache;
    private Thread sendLogsThread;
    private bool fetchingLogs;

    #endregion

    ~Device()
    {
        if ( Connection != null)
            if (Connection.Connected)
                Connection.Disconnect();
    }

    #region Properties

    [Browsable (false)]
    public virtual long PK { get; set; }

    [DescriptionAttribute("Connection Configuration"), DisplayName("Want Local Connection")]
    public virtual bool WantLocal
    {
        get { return wantLocal; }
        set { wantLocal = value; }
    }

    [DescriptionAttribute("Connection Configuration"), DisplayName("Local Connection")]
    public virtual Connection LocalConnection
    {
        get { return localConnection; }
        set { localConnection = value; }
    }

    [DescriptionAttribute("Connection Configuration"), DisplayName("Network Connection")]
    public virtual Connection Connection
    {
        get { return connection; }
        set { connection = value; }
    }

    [Browsable (false)]
    public virtual PacketMutexQueue PackQueueIn
    {
        get { return PacketIn; }
        set { PacketIn = value; }
    }

    [Browsable (false)]
    public virtual PacketMutexQueue PackQueueOut
    {
        get { return PacketOut; }
        set { PacketOut = value; }
    }

    [Browsable (false)]
    public virtual Thread PacketFactoryThread
    {
        get { return packetfactorythread; }
        set { packetfactorythread = value; }
    }

    [Browsable (false)]
    public virtual MutexBindingList<PD_Log> Logs
    {
        get { return logs; }
        set { logs = value; }
    }

    [CategoryAttribute("Configuration"),
        DescriptionAttribute("PD Configuration")]
    public virtual Packet Configuration
    {
        get { return configuration; }
        set { configuration = value; }
    }

    [Browsable (false)]
    public virtual ConfigurationCache ConfigurationCache
    {
        get { return configurationCache; }
        set { configurationCache = value; }
    }

    [Browsable (false)]
    public virtual Dispatcher Dispatcher
    {
        get { return dispatcher; }
        set { dispatcher = value; }
    }

    [Browsable (false)]
    public virtual Thread SendLogsThread
    {
        get { return sendLogsThread; }
        set { sendLogsThread = value; }
    }

    [Browsable (false)]
    public virtual bool FetchingLogs
    {
        get { return fetchingLogs; }
        set { fetchingLogs = value; }
    }

    #endregion
    }
[TypeConverter(typeof(ExpandableObjectConverter))]
[CategoryAttribute("Connection")]
public class Connection
{
    #region Fields

    protected byte[] Data = new byte[2048];
    protected int size = 2048;
    protected StringMutexQueue InBuffer = new StringMutexQueue(100, 5000);
    protected StringMutexQueue OutBuffer = new StringMutexQueue(100, 5000);
    private bool connected;

    #endregion

    #region Properties

    [Browsable (false)]
    public virtual StringMutexQueue BufferIn
    {
        get { return InBuffer; }
        set { InBuffer = value; }
    }

    [Browsable(false)]
    public virtual StringMutexQueue BufferOut
    {
        get { return OutBuffer; }
        set { OutBuffer = value; }
    }

    [DescriptionAttribute("Connected")]
    public virtual bool Connected
    {
        get { return connected; }
        set { connected = value; }
    }

    [Browsable(false)]
    public virtual long PK { get; set; }

    #endregion

    public virtual void Connect()
    {
        throw new System.NotImplementedException();
    }

    public virtual void Disconnect()
    {
        throw new System.NotImplementedException();
    }

    public Connection() { }
}
<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>
<many-to-one class="EMTRAC.Connections.Connection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="LocalConnection" lazy="false" fetch="join" 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" fetch="join" cascade="all" unique="true">
  <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">
  <key>
    <column name="Device_id" />
  </key>
  <bag name="Zones">
    <key>
      <column name="Intersection_id" />
    </key>
    <one-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </bag>
  <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" 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>
  <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>
  <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>
IQuery q = session.CreateQuery("from Device");
IList results = q.List();
        declare @p0 BIGINT
    SET @p0 = 1


    NHibernate: 
    SELECT 
        connection0_.PK as PK30_0_, 
        connection0_.Connected as Connected30_0_, 
        connection0_1_.Baud as Baud31_0_, 
        connection0_1_.Port as Port31_0_, 
        connection0_2_.EndPoint as EndPoint32_0_, 
        connection0_2_.Port as Port32_0_, 
    case 
        when connection0_1_.Connection_id is not null then 1 
        when connection0_2_.Connection_id is not null then 2 
        when connection0_.PK is not null then 0 
    end 
    as clazz_0_ 

    FROM 
        [Connection] connection0_ left outer join ConnectionSerial connection0_1_ 
        on 
        connection0_.PK=connection0_1_.Connection_id left outer join ConnectionTCP connection0_2_ 
        on 
        connection0_.PK=connection0_2_.Connection_id 
    WHERE connection0_.PK=@p0
[TypeConverter(typeof(ExpandableObjectConverter))]
public class ConnectionTCP : Connection
{
    #region Fields

    private TcpClient client;
    protected NetworkStream stream;
    private string endpoint;
    private int port;
    private int maxMessageSize = 4096;

    Thread commThread;

    #endregion

    #region Constructors

    public ConnectionTCP() { }

    public ConnectionTCP(string ipAdd, int port)
    {
        //  Set the Device EndPoint
        EndPoint = ipAdd;
        //  Set the Device Port
        Port = port;
        Client = new TcpClient(EndPoint, Port);
        //  Set Connected status
        Connected = false;
    }

    #endregion

    #region Properties

    [Browsable(false)]
    public virtual long PK { get; set; }

    [Browsable(false)]
    public virtual TcpClient Client
    {
        get { return client; }
        set { client = value; }
    }

    [Browsable(false)]
    public virtual NetworkStream Stream
    {
        get { return stream; }
        set { stream = value; }
    }

    [CategoryAttribute("Network Address"),
        DisplayName("End Point"),
        DescriptionAttribute("The network address of the Priority Detector.")]
    public virtual string EndPoint
    {
        get { return endpoint; }
        set { endpoint = value; }
    }

    [CategoryAttribute("Port"), 
        DescriptionAttribute("The port used to connect to the Priority Detector.")]
    public virtual int Port
    {
        get { return port; }
        set { port = value; }
    }

    #endregion
    }

[TypeConverter(typeof(ExpandableObjectConverter))]
public class ConnectionSerial : Connection
{
    private Thread commThread;
    private int dataBits = 8;
    private Parity parity = Parity.None;
    private List<string> ports = new List<string>();
    private SerialPort serialConn;
    private StopBits stopBits = StopBits.One;
    private int timeoutRead = 10000;
    private int timeoutWrite = 10000;

    private int baud;
    private string port;

    [Browsable (false)]
    public virtual long PK { get; set; }

    [DescriptionAttribute("Serial Connection"), DisplayName("Serial Connection")]
    public virtual SerialPort SerialConn
    {
        get { return serialConn; }
        set { serialConn = value; }
    }

    [Browsable (false)]
    public virtual int Baud
    {
        get { return SerialConn.BaudRate; }
        set { baud = SerialConn.BaudRate; }
    }

    [Browsable(false)]
    public virtual string Port
    {
        get { return SerialConn.PortName; }
        set { port = SerialConn.PortName; }
    }

    #region Constructors

    public ConnectionSerial() { }

    public ConnectionSerial(string port, int baud)
    {
        SerialConn = new SerialPort();
        SerialConn.PortName = port;
        SerialConn.BaudRate = baud;
        SerialConn.Parity = parity;
        SerialConn.DataBits = dataBits;
        SerialConn.StopBits = stopBits;

        SerialConn.ReadTimeout = timeoutRead;
        SerialConn.WriteTimeout = timeoutWrite;

        //  Set Connected status
        Connected = false;
    }

    #endregion
    }
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Connections.Connection, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Connection`">
<id name="PK" type="System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="PK" />
  <generator class="identity" />
</id>
<property name="Connected" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Connected" />
</property>
<joined-subclass name="EMTRAC.Connections.ConnectionSerial, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <key>
    <column name="Connection_id" />
  </key>
  <property name="Baud" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <column name="Baud" />
  </property>
  <property name="Port" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <column name="Port" />
  </property>
</joined-subclass>
<joined-subclass name="EMTRAC.Connections.ConnectionTCP, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <key>
    <column name="Connection_id" />
  </key>
  <property name="EndPoint" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <column name="EndPoint" />
  </property>
  <property name="Port" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <column name="Port" />
  </property>
  <!--<property name="Client" type="EMTRAC.Connections.TcpClientMapper, EMTRAC_v3"/>-->
  <!--<property name="Client" type="EMTRAC.Connections.TcpClientMapper, EMTRAC_v3" />-->
</joined-subclass>