Свободное автоматическое отображение NHibernate - PullRequest
1 голос
/ 09 сентября 2011

Я просто бродил, можно ли использовать Fluent NHibernate для автоматического сопоставления объекта .Net TcpClient?

У меня есть класс, у которого есть свойство TcpClient, которое я хотел бы отобразить.

Я попытался создать собственный класс, наследуемый от TcpClient с именем tTcpClient, и добавить свойство Id с помощью getter / setter;тем не менее, он все еще искал поле Id для базового класса.

У кого-нибудь есть какие-либо идеи, если это возможно, или мне нужно будет создать собственное сопоставление xml для TcpClient?

Я надеялся, что смогу сохранить объект, чтобы легко воссоздать его при перезагрузке приложения и привязать свойства объекта TcpClient к PropertiesGrid и разрешить настройку через это довольно просто.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

NHibernate не знает, как работать со сложными типами, такими как TcpClient из коробки. Но это позволяет вам самим загружать и хранить код. Вы можете использовать IUserType :

public class TcpClientMapper : IUserType {

    public SqlType[] SqlTypes {
        get {
            return new[] { 
                           new SqlType(DbType.String), 
                           new SqlType(DbType.Int32) 
                         };
        }
    }

    public Object NullSafeGet(IDataReader rs, String[] names, ...) {

        String address = NHibernateUtil.String.NullSafeGet(rs, names[0]);
        Int32 port = NHibernateUtil.Int32.NullSafeGet(rs, names[1]);

        return new TcpClient(address, port);
    }

    public void NullSafeSet(IDbCommand cmd, Object value, Int32 index) {
        TcpClient tcpClient = value as TcpClient;
        if(tcpClient == null) {
            NHibernateUtil.String.NullSafeSet(cmd, null, index);
            NHibernateUtil.Int32.NullSafeSet(cmd, null, index + 1);
        } else {
            EndPoint red = tcpClient.Client.RemoteEndPoint;
            IPEndPoint endpoint = ((IPEndPoint)red);
            NHibernateUtil.String.Set(cmd, endpoint.Address.ToString(), index);
            NHibernateUtil.Int32.Set(cmd, endpoint.Port, index + 1);
        }
    }

    public Type ReturnedType {
        get { return typeof(TcpClient); }
    }

    // TODO: implement other methods
}

И отобразите это так в hbm:

<property name="_tcpClient" type="MyNamespace.TcpClientMapper, MyAssembly">
    <column name="Address" />  <!-- NullSafeGet/Set index == 0 -->
    <column name="Port" />     <!-- NullSafeGet/Set index == 1 -->
</property>

Или используйте свободный UserTypeConvention :

public class TcpClientUserTypeConvention : UserTypeConvention<TcpClientMapper> {
}
1 голос
/ 09 сентября 2011

Nathan,

Вы смотрели этот проект?

http://automapper.org/

Приветствия

...