0

次のようなエンティティを考えてみましょう:

 public class Document
 {

    public int Id { get; set; }

    public long code { get; set; }

    // Rest of Props

 }

私が必要としているのは、一意の長いコードを生成することであり、ID に基づいて生成することを好みます。

シンプルで古典的だが安全でない解決策の 1 つは、最後の Id を取得してそれを 1 増やして使用することですが、計算列などのより良い解決策や、コード生成をデータベースに割り当てる他の方法を探しています。

  • 計算列として定義しようとすると Id にアクセスできません。
  • Id はすでに Identity 列であるため、Identity としてマークすることはできません。
  • 最後の Id を取得するメソッドを作成することは、安全でクリーンではありません。

今では、安全にするためにトランザクションの助けを借りて、以前の古典的なソリューションを実行しようとしています。

より良い提案はありますか?

4

2 に答える 2

2

テーブルごとに 1 つの ID フィールドという制限に対する回避策は、フィールドと関連するフィールドDocumentsを含む別のテーブルにテーブルを正規化することです。code

codeID フィールドのベース値 (日付に基づく) を取得するには、必要な最低値を単純にシードすることができます。基礎となる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. コードでドキュメント テーブルを検索する
于 2014-07-15T10:30:01.217 に答える
1

質問の範囲を考えると、コンテキスト全体を知らなくても、最も簡単な解決策は、 code フィールドを計算されたプロパティにすることです。

つまり、シード値 (オフの日付に基づく) をIdフィールドと連結して、アプリケーションのコード フィールドを計算します。

コードに基づいてドキュメントを検索するには、指定されたコードから Id を分割し、それを使用してドキュメント テーブルを検索します。

于 2014-07-15T10:44:43.367 に答える