2011-08-03 10 views
5

SQL Serverデータベースに行を追加するテーブルがあります。プライマリキーは自動インクリメントではなく、私はそれをしたくありません。しかし、この機会に、次の利用可能な値を持つ行を追加したいと思います。これを行う簡単な方法はありますか?私は最大値のテーブルを照会してからインクリメントすることができますが、EFを使用すると簡単な方法がありますか?.NET Entity Frameworkインクリメンタルプライマリキーで新しい行を追加

MAX値を取得するために別のクエリが必要な場合は、LINQでどのようにこれを行いますか?

答えて

5

サーバーがID列または計算列でない場合は、次のような場合があります。

myRecord.ID = Context.Records.Max(record => record.ID) + 1; 
+1

ありがとうございました。 – Jonnster

3

特に、次の利用可能な値(=ギャップなし)を主張する場合、簡単な方法はありません。自動増分値を使用すると、アプリケーションのパフォーマンスが向上します。

何が問題ですか?あなたがデータベース

にエンティティを保存する必要があなたのエンティティ

  • に割り当てる必要があり、データベース
  • から値を取得する必要があり

    1. は簡単に見えますが、ではありませんそれ?他のスレッドがステップ3に達する前に同時に複数のスレッドがステップ1を実行できる同時環境がある場合はありません。すべてのスレッドは同じ値のレコードを挿入します。

      どうすれば対処できますか? 1つの方法は、値を取得してインクリメントするために、最大値とアトミック演算を持つ別のテーブルを使用することです。私はこのような何かをやってストアドプロシージャがアトミックであるべきだと思う:

      DECLARE @Result INT 
      UPDATE SequenceTable SET @Result = MaxValue = MaxValue + 1 WHERE SequnceName = '...' 
      RETURN @Result 
      

      ストアドプロシージャへの呼び出しは、最高のスループットを作るために、任意のトランザクションの外でなければなりません。

      これは、うまくいけば、一意の数字を生成することができますが、ギャップのないシーケンスは生成できません。そのような操作で値を取ってその値を使用しないと、値が失われ、シーケンスにギャップが含まれます。

      ギャップを必要としない場合は、ストアドプロシージャ呼び出しと操作をトランザクションに入れて、データがコミットされるまでシーケンステーブルのレコードがロックされるようにする必要があります。

  • 関連する問題