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> {
}
我明白了。我將不得不實施IUserType的所有方法,然後我會假設它爲了工作?如果是的話,你將如何實現這個NullSafeSet?我的類中的屬性本身仍然是常規的TcpClient權利,還是需要將其更改爲ClientMapper類? –
是的,你必須實現所有的方法,這並不難,看看答案中的鏈接。屬性仍然是一個普通的TcpClient(從設計的角度來看這有點奇怪)。請參閱上次編輯NullSafeSet實現。 – Dmitry
這看起來不錯,感謝您的幫助。 另一個快速問題?您如何知道發送到字符串[]數組的內容的順序?我意識到你閱讀的屬性,但你怎麼知道地址在位置0和陣列中的位置1的端口? 我問的原因是B/C我試圖實現串行連接相同。 –