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

时间:2014-07-15 09:44:08

标签: c# entity-framework ef-code-first auto-generate autogeneratecolumn

考虑这样的实体:

 public class Document
 {

    public int Id { get; set; }

    public long code { get; set; }

    // Rest of Props

 }

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

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

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

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

有什么更好的建议吗?

2 个答案:

答案 0 :(得分:1)

每个表限制单个标识字段的解决方法只是将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. 为最终用户创建计算代码
  4. 创建Document实体,传入生成的代码
  5. 根据代码搜索文档:

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

答案 1 :(得分:1)

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

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

要根据代码搜索文档,您只需从给定代码中拆分Id,然后使用它来搜索Documents表。