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

How can I source an NHibernate composite key's values from an Oracle sequence using Mapping.ByCode?

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

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

以下适用于单个键,但 ComposedId 使用 IComposedIdMapper,它似乎不等同于 IIdMapperGenerator:

Id<decimal>(x => x.Id, o =>
{
    o.Column("ID");
    o.Generator(Generators.Native, genMapping => genMapping.Params(new { sequence = "MY_SCHEMA.MY_ID_SEQ" }));
});

如果一列是从每次插入时递增的序列生成的,它应该是唯一的。所以它可以映射为单个列 id。

复合 id 不允许使用生成器,因为它们本质上是分配给其他表的一些主键的,或者像 "type of the entity" 结合了女性所有者的键,等级的一些枚举值, 随便.

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

但通常情况下,如果你想为 id 使用序列,请使用单个列 id,而不是复合列。

在我看来,使用带有唯一值的一列的复合 ID 是非常错误的:最好尽可能避免使用复合 ID。如果该值是唯一的,则不需要任何额外的列作为主键。

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