Nhibernate标准:'select max(id)......'

Awk*_*der 9 t-sql nhibernate icriteria

我可以使用Criteria执行t-sql命令来选择表中列的最大值吗?

'从客户中选择@cus_id = max(id)+ 1'

奥利

Chs*_*y76 23

使用投影:

session.CreateCriteria(typeof(Customer))
  .SetProjection( Projections.Max("Id") )
  . UniqueResult();
Run Code Online (Sandbox Code Playgroud)


tpd*_*pdi 15

Max(id)+ 1是生成id的一种非常糟糕的方法.如果这是您的目标,请找到另一种生成ID的方法.

编辑:回答LnDCobra:

这很糟糕,因为当你进行插入时很难确保你得到的max(id)仍然是max(id).如果另一个进程插入一行,您的插入将具有相同的ID,并且您的插入将失败.(或者,相反,如果您的插入首先发生,则其他进程的插入将失败.)

为了防止这种情况,你必须阻止任何其他插入/使你的get和后续插入原子,这通常意味着锁定表,这将损害性能.

如果您只锁定写入,则另一个进程获得max(id),这与您获得的max(id)相同.您执行插入并释放锁定,它会插入重复的ID并失败.或者它也试图锁定,在这种情况下它会等你.如果你也锁定读取,每个人都在等你.如果它也锁定写入,那么它不会插入重复的id,但它会等待你的读取和写入.

(它打破了封装:你应该让rdbms找出它的ID,而不是连接到它的客户端程序.)

通常,这种策略要么:
*break
*需要一堆"管道"代码才能使其工作
*显着降低性能
*或全部三

它将比使用RDBMS的内置序列或生成的自动增量ID更慢,更不健壮,并且需要更难维护的代码.

  • 有人可以指出我正确的方向,为什么不使用它来生成id,如果是这样更好的方式......? (2认同)