EF6:如何根据实体ID自动生成唯一编号

考虑这样的实体:

public class Document { public int Id { get; set; } public long code { get; set; } // Rest of Props } 

我需要的是生成一个唯一的长代码,我更喜欢基于Id生成它。

一个简单的经典但不安全的解决方案是获取最后一个Id并将其增加一个并使用,但我正在寻找更好的解决方案,例如计算列,或任何其他方式将代码生成分配给数据库。

  • 如果我尝试将其定义为计算列,则无法访问Id。
  • 将其标记为标识是不可能的,因为Id已经是标识列。
  • 创建获取最后一个ID的方法并不安全和干净。

到目前为止,我正试图在交易的帮助下做前经典解决方案,以确保安全。

还有更好的建议吗?

限制每个表的单个标识字段的解决方法只是将Documents表规范化为包含code字段和任何相关字段的另一个表。

为了获得code标识字段的基值(基于日期),可以简单地以最低的期望值播种。 不知道底层的RDMS,但对于MySQL,它将沿着http://dev.mysql.com/doc/refman/5.1/en/example-auto-increment.html的路线。

所以,像

 Documents 1-1 DocumentCodes 

哪里:

 DocumentCodes ------------- code : identity (seeded to desired base value) documentId : int FK UNIQUE 

允许code字段单独生成(包括之前 )实际Document实体的另一种替代方法如下:

 DocumentCodes ------------- code : identity PK Documents --------- id : identity code : id FK 

实际的code字段可以播种到所需的基数,或者根据我的其他答案用作计算属性的一部分。

  1. 在DocumentCodes表中创建一个实体并获取生成的代码
  2. 根据生成的代码和从日期生成的数字为最终用户创建计算代码
  3. 创建Document实体,传入生成的代码

要根据代码搜索文档:

  1. 从计算代码中删除日期部分
  2. 在代码中的Document表中搜索

鉴于问题的范围并且不知道整个上下文,最简单的解决方案是将代码字段作为计算属性

即通过将种子值(基于关闭日期)与Id字段连接来计算应用程序中的代码字段。

要根据代码搜索Document,您只需从给定代码中拆分Id,然后使用它在Documents表中进行搜索。