簡體   English   中英

EF6:如何根據實體ID自動生成唯一編號

[英]EF6: How to generate a unique number automatically based on entity 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. 在文檔表中搜索代碼

給定問題的范圍並且不了解整個上下文,最簡單的解決方案是將代碼字段作為計算屬性

即通過將種子值(基於截止日期)與Id字段連接起來,在應用程序中計算代碼字段。

要基於代碼搜索文檔,您只需將ID與給定的代碼分開,然后使用它在“文檔”表中進行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM