2012-08-30 55 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