2017-05-25 46 views
0

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

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

适用于一个单一的键,但ComposedIdIComposedIdMapper使用,这似乎不具有相当于IIdMapperGenerator

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

回答

1

如果从序列产生一列在每个插入时递增,它应该是独一无二的。所以它可以被映射为单个列ID。

复合ID不允许生成器,因为它们本质上是分配给另一个表的某个主键或某种枚举值(如“实体类型”(地址类型,电话类型,无论))。

如果您想为序号使用序号,请使用单个列ID,而不是复合ID。

它看起来对我来说使用一个具有唯一值生成的列的composite-id很不妥:尽可能避免使用composite id。如果该值是唯一的,则不需要任何其他列作为主键。

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

+0

我同意这个设计有点奇怪。这是一个现有的回购,这个特定的实体之前没有被使用过,我正在使用它。看起来有些情况下这些键是手动设置的,有些是需要自动生成的,所以我认为你的'CreateSQLQuery'具有手动分配功能。谢谢! –

+0

@EricEskildsen,我用方言重新调整了它的代码。我忘记了这个属性只能从实现接口中获得。在答案中,我提供了一个“无投票”的解决方案。从'ISessionFactory',它可以通过将其转换为'ISessionFactoryImplementor'来代替。 –

相关问题