C# 自动生成ID

C# 自动生成ID,c#,asp.net,oracle,nhibernate,C#,Asp.net,Oracle,Nhibernate,我需要生成一个带有 以下特点: Id必须是唯一的 Id由“类型”和“自动递增”数字两部分组成 “type”是整数,值可以是1、2或3 “自动递增”数字从10001开始,每次id递增 是生成的 类型从web表单和自动递增的数字中选择 来自数据库 示例:如果选择类型为2,且自动递增的数字为10001 然后生成的id为=210001 可能有成百上千的用户在生成id。现在我的问题是, 这可以在没有存储过程的情况下完成,这样就没有id确认了 我正在使用ASP.Net(C#)、Oracle、NHiberna

我需要生成一个带有 以下特点:

  • Id必须是唯一的

  • Id由“类型”和“自动递增”数字两部分组成

  • “type”是整数,值可以是1、2或3

  • “自动递增”数字从10001开始,每次id递增 是生成的

  • 类型从web表单和自动递增的数字中选择 来自数据库

  • 示例:如果选择类型为2,且自动递增的数字为10001

    然后生成的id为=210001

    可能有成百上千的用户在生成id。现在我的问题是, 这可以在没有存储过程的情况下完成,这样就没有id确认了


    我正在使用ASP.Net(C#)、Oracle、NHibernate

    当您使用Oracle时,您可以使用a


    每次调用\u sequence.NEXTVAL时,都会返回一个唯一的号码。

    如果不能使用自动递增类型(如sequence),请创建一个包含每种类型的表,并保留其当前值的分数。请小心控制对此表的访问,并使用它生成新的数字。不过,它可能会成为数据库中的一个热点。

    为什么Hi-Lo的NHibernate实现不可接受


    用ID的第一个数字来定义类型有什么意义?为此,您应该使用单独的列,然后对实际ID使用普通的自动递增主键。

    最干净的方法是——正如Scott Anderson所说——使用两列。每个属性都应该是原子的,即只有一个含义。对于多值列,您必须应用函数(substr)来显示例如类型。约束将更难定义。没有什么比简单的“检查(整数输入(1,2,3))”或“检查(id>10000)”更好的了

    至于定义第二个属性——我们称之为“id”——从10001开始的数字,您有两个很好的策略:

    1) 使用一个序列,从1开始,在显示时使用表达式“10000+行数()over(按整数分区\u类型按id排序)”,让用户看到他们想要的数字

    2) 使用三个序列,每个整数类型一个,让它们有一个10001的start with子句

    您肯定应该使用序列的原因是可伸缩性。如果不使用序列,则必须将当前值存储在某个表中,并序列化对该表的访问。这在多用户系统中是不好的。使用序列,您可以设置缓存属性以减少几乎所有的争用问题

    希望这有帮助

    问候,, 罗布