如何使用Mapping.ByCode从Oracle序列中获取NHibernate组合键的值?

时间:2017-05-25 19:00:24

标签: c# oracle nhibernate nhibernate-mapping

使用NHibernate的Mapping.ByCode,如何从Oracle序列中获取复合键的初始值?

ComposedId(map =>
{
    map.Property(x => x.Column1);
    map.Property(x => x.Column2);
});

以下内容适用于单个密钥,但ComposedId使用IComposedIdMapper,其似乎与IIdMapper的{​​{1}}不相同:

Generator

1 个答案:

答案 0 :(得分:2)

如果从每个插入处递增的序列生成一列,则它应该是唯一的。因此它可以映射为单个列ID。

复合id不允许生成器,因为它们本质上被分配,例如分配给其他表的某些主键,或者某些枚举值,例如“实体类型”组合了一个wome所有者的密钥,一个等级,不管。

如果你真的需要,你仍然可以使用序列来分配复合id的一部分,但你必须自己调用获取其值并将其分配给复合id的序列。使用ISession.CreateSQLQuery("adequate sql for your db")执行此操作。您可以在会话工厂公开的dialect对象的帮助下构建您的sql。 (致电ISession.GetSessionImplementation().Factory.Dialect.GetSequenceNextValString("sequenceName")。)

但通常情况下,如果要对id使用序列,请使用单个列ID,而不是复合列。

使用带有唯一值的一列的composite-id对我来说非常错误:尽可能避免使用复合id。如果该值是唯一的,则不需要任何其他列作为主键。

顺便说一句,在大多数情况下,NHibernate不关心映射的id是否实际上是在数据库中声明为主要的,是否将关联键声明为外键,...仅重要如果您使用NHibernate进行模式生成。所以更好地以更有意义的方式映射它们,除非你有一些奇怪的东西阻止你在NHibernate映射中简化它们。