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
字段可以播种到所需的基数,或者根据我的其他答案用作计算属性的一部分。
- 在DocumentCodes表中创建一个实体并获取生成的代码
- 根据生成的代码和从日期生成的数字为最终用户创建计算代码
- 创建Document实体,传入生成的代码
要根据代码搜索文档:
- 从计算代码中删除日期部分
- 在代码中的Document表中搜索
鉴于问题的范围并且不知道整个上下文,最简单的解决方案是将代码字段作为计算属性 。
即通过将种子值(基于关闭日期)与Id字段连接来计算应用程序中的代码字段。
要根据代码搜索Document,您只需从给定代码中拆分Id,然后使用它在Documents表中进行搜索。