0

考虑这样的实体:

 public class Document
 {

    public int Id { get; set; }

    public long code { get; set; }

    // Rest of Props

 }

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

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

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

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

有更好的建议吗?

4

2 回答 2

2

每个表的单个标识字段限制的解决方法是将表规范化为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单独生成字段(包括before)实际 Document 实体的另一个替代方法如下:

DocumentCodes
-------------
code : identity PK

Documents
---------
id : identity
code : id FK 

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

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

根据代码搜索文档:

  1. 从计算的代码中去除日期部分
  2. 在文档表中搜索代码
于 2014-07-15T10:30:01.217 回答
1

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

计算应用程序中的代码字段。

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

于 2014-07-15T10:44:43.367 回答