2012-08-30 104 views
1

我想在Firebird和MSSQL DB之間建立一個通用的DataTransfer。 這兩個Business-Lib都包含「相同」類,其中包含具有相同名稱的屬性。NHibernate確定關鍵屬性

我的問題是,當我有一個組合鍵的映射,我不知道有多少或許多屬性構建的ID。

所以使用單個ID很容易,它總是我的映射文件中的第一個屬性。

但是如果我有一個複合ID呢? 我將不得不確定構建密鑰的屬性。

我認爲可以通過de hbm.xml文件來完成,但我不確定這是否可行。

有沒有人有一個想法我可以如何決定什麼屬性在運行時構建密鑰?使用

回答

2

的配置,可以讓每個類的identifyer財產

foreach(var clazz in config.ClassMappings) 
{ 
    var idProperties = clazz.IdentifierMapper.PropertyIterator 
} 

alternativly如果你只想要查詢,如果該對象已經存在(和的EntityType可以在運行時才能知道)

var classMetadata = sessionfactory.GetClassMetadata(obj.GetType()); 
object id; 
if (classMetadata.IdentifierType.IsComponentType) 
    id = obj; 
else 
    id = classMetadata.GetIdentifier(obj, NHibernate.EntityMode.Poco); 

fromDatabase = session.Get(classMetadata.EntityName, obj); 
if (fromDatabase != null) 
    // already exists 
+0

非常感謝,這就是我正在尋找! – ok3n0b1

+0

但我還有一個問題。 當我沒有錯誤時,獲取函數總是需要兩個參數。 實體類型和對象的標識符。對 ? – ok3n0b1

+0

如果你知道編譯時obj的類型,你可以使用通用版本,否則第一個參數是entityname,我將編輯 – Firo