NHibernate:递增函数没有得到下一个序列值

时间:2016-10-18 10:27:39

标签: c# asp.net-mvc oracle nhibernate increment

当我尝试使用NHibernate保存实体时出现以下错误:

System.Data.OracleClient.OracleException (0x80131938): ORA-00001: unique constraint (FEMADEV.TRN_INFLOW_DETAILS_HIS_PK) violated

我的控制器代码:

TrnInflowDetailsHis trnInflowDetailsHis = Mapper.Map<TrnInflowDetailsHis>(trnInflowDetailsAud);
trnInflowDetailsHis.InflowSeq = trnInflowDetailsAud.Id;
trnInflowDetailsHisService.Add(trnInflowDetailsHis);

映射代码:

 public class TrnInflowDetailsHisMap : ClassMap<TrnInflowDetailsHis>
 {
    public TrnInflowDetailsHisMap()
    {
        Table("TRN_INFLOW_DETAILS_HIS");
        LazyLoad();
        Id(x => x.Id).Column("INFLOW_ID").GeneratedBy.Increment();
        Map(x => x.InflowSeq).Column("INFLOW_SEQ");
        Map(x => x.TranRef).Column("TRAN_REF");
        Map(x => x.Currency).Column("CURRENCY");
     }
  }

这里的问题是,GeneratedBy.Increment()工作正常,但有时它不会递增下一个序列值。我不知道是什么问题。所以请任何人帮我找到解决方案。

1 个答案:

答案 0 :(得分:0)

我怀疑该问题更多是关于多个并发实例,而不是increment生成器中的错误

例外ORA-00001表示:

  

UPDATE或INSERT语句尝试插入重复键。对于在DBMS MAC模式下配置的受信任的Oracle,如果存在不同级别的重复条目,您可能会看到此消息。

换句话说,有人已经INSERT了ID值,当前线程试图使用。这可能很容易在多应用实例中使用ID生成器Increment访问相同的数据库。

文档5.1.5.1. generator

  

增量

     
      
  • 生成任何整数类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。 不要   在集群中使用。
  •   

所以,只需将此生成器更改为其他任何内容。 increment可能用于开发,也可用于几乎不可变的类型。或者,如果您可以确定,那时只运行一个实例(一个应用程序)。