我正在尝试在 Firebird 和 MSSQL DB 之间进行通用 DataTransfer。两个业务库都包含“相同”的类,其中包含具有相同名称的属性。
我的问题是,当我有一个带有复合键的映射时,我不知道有多少或哪些属性构建了 id。
因此,使用单个 ID 很容易,它始终是我的映射文件中的第一个属性。
但是,如果我有一个复合 ID 怎么办?我必须确定构建密钥的属性。
我认为这可以通过 de hbm.xml 文件完成,但我不确定这是否可行。
我如何确定哪些属性在运行时构建密钥?
我正在尝试在 Firebird 和 MSSQL DB 之间进行通用 DataTransfer。两个业务库都包含“相同”的类,其中包含具有相同名称的属性。
我的问题是,当我有一个带有复合键的映射时,我不知道有多少或哪些属性构建了 id。
因此,使用单个 ID 很容易,它始终是我的映射文件中的第一个属性。
但是,如果我有一个复合 ID 怎么办?我必须确定构建密钥的属性。
我认为这可以通过 de hbm.xml 文件完成,但我不确定这是否可行。
我如何确定哪些属性在运行时构建密钥?
使用配置,您可以向每个类询问其标识属性
foreach(var clazz in config.ClassMappings)
{
var idProperties = clazz.IdentifierMapper.PropertyIterator
}
或者,如果您只想查询对象是否已经存在(并且实体类型只能在运行时知道)
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