NHibernateのは、箱から出しれるtcpClientのような複雑な型に対処する方法を知りません。しかし、それはあなた自身のロードと格納のコードを提供することができます。
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でこのようにそれをマッピングします:あなたはIUserTypeを使用することができます
<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> {
}
私は参照してください。私はIUserTypeのためのすべてのメソッドを実装する必要がありますし、私はそれが動作するために仮定したいと思いますか?もしそうなら、このためにNullSafeSetをどのように実装しますか?私のクラス自体のプロパティは、通常のTcpClient権限のままですか、それをClientMapperクラスに変更する必要がありますか? –
はい、すべてのメソッドを実装する必要があります。難しくありません。答えのリンクを見てください。プロパティは通常のTcpClientのままです(これはデザインの観点からは少し奇妙です)。 NullSafeSet実装の最後の編集を参照してください。 – Dmitry
それは助けてくれてありがとうございます。 別の簡単な質問ですか?どのようにStrings []配列に送られるのかを知っていますか?私はあなたのプロパティを読むことを認識しますが、アドレスが位置0にあり、ポートが配列の位置1にあることをどのように知っていますか? 私が尋ねる理由はb/cです。シリアル接続でも同じことを実装しようとしています。 –