Fluent Nhibernate映射具有复合密钥的遗留数据库

Fluent Nhibernate映射具有复合密钥的遗留数据库,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我正在使用传统的Oracle DB开发的应用程序中使用Fluent NHibernate(我对它相当陌生)。DB有复合键,由外键和数据库生成的列组成。生成的列通过使用表名和其他外键部分之一调用DB函数来提供。生成的复合关键部件不是唯一的,我无法更改这一点。生成的键部分也经常用作其他表上的外键 如果我创建实体映射来指定数据库中的复合键,那么我们就不能使用任何身份生成策略,这会破坏工作单元 如果我创建的实体映射只将生成的列指定为主键,那么我可以使用触发器标识来生成ID,并获得工作单元,但是当我想要更

我正在使用传统的Oracle DB开发的应用程序中使用Fluent NHibernate(我对它相当陌生)。DB有复合键,由外键和数据库生成的列组成。生成的列通过使用表名和其他外键部分之一调用DB函数来提供。生成的复合关键部件不是唯一的,我无法更改这一点。生成的键部分也经常用作其他表上的外键

如果我创建实体映射来指定数据库中的复合键,那么我们就不能使用任何身份生成策略,这会破坏工作单元

如果我创建的实体映射只将生成的列指定为主键,那么我可以使用触发器标识来生成ID,并获得工作单元,但是当我想要更新或访问子集合时,就会出现问题:键的其他部分不包括在WHERE语句中

有人能给我一些关于如何进行的建议吗

  • 如果我坚持使用映射复合键,我可以扩展nhibernate以输出SQL以使用触发器标识吗?如果是,你能建议一个起点吗
  • 如果映射单个列键,是否可以在WHERE子句中包含其他属性以进行多个映射和更新

不幸的是,正如您已经发现的那样,根本不支持此设置


我的建议是手动执行插入(例如,使用自定义SQL)。是的,这破坏了UoW,但是
标识也一样。

不幸的是,正如您已经发现的那样,此设置完全不受支持


我的建议是手动执行插入(例如,使用自定义SQL)。是的,这打破了UoW,但是
身份也一样。

你可以试试
@Firo,我认为这在流畅的NHibernate中是不可能的。如果使用XML映射,这会输出SQL语句以返回生成的id,并将其用于外键htink吗?AFAIK FNH has.generated(),have tocheck@Firo:是的,有一个.Generated()方法可用,但不适用于CompositeId()。我现在已经解决了这个问题。你可以试试
..
@Firo,我认为这在Fluent NHibernate上是不可能的。如果使用XML映射,这会输出SQL语句以返回生成的id,并将其用于外键htink吗?AFAIK FNH has.generated(),have tocheck@Firo:是的,有一个.Generated()方法可用,但不适用于CompositeId()。我现在已经解决了这个问题。将发布解决方案的编辑。hi@Diego,您是否认为有可能以某种方式扩展nhibernate,以便我可以输出SQL以调用ID生成函数来设置插入或更新查询中的ID和外键参数?如果是这样的话,你能给我一个开始的想法,或者告诉我关于这个的任何文档吗?也许是的。我不知道怎么做。您好@Diego,您认为有可能以某种方式扩展nhibernate,以便我可以输出SQL来调用ID生成函数,以在insert或update查询中设置ID和外键参数吗?如果是这样的话,你能给我一个开始的想法,或者告诉我关于这个的任何文档吗?也许是的。我不知道怎么做。