0

説明が長いのでご了承ください。

データを挿入するためのマップされたストア手順を使用して、EF4 でテーブルをセットアップしました。

例 :

    id | location | type
    1  |     10   |  15
    5  |     10   |  16

SP が行うことは、場所とタイプに対応する次の ID を別のテーブルでチェックすることです。

したがって、この例では、次の id は

  • ロケーション 10 およびタイプ 15 の場合は 2
  • 6 場所 10 タイプ 16

これは、EF で結果列をマッピングすることによって機能します。

2 つの異なるキーに同じ連続番号の例がある場合を除き、問題なく動作します。

    id | location | type
    1  |     10   |  11
    1  |     10   |  10

編集:このエラーは、両方の新しい行を同時に作成しているときに発生します。

両方の次の値は 2 です。データはデータベースに保存されますが、アプリケーションは次のメッセージで失敗します。

データベースへの変更は正常にコミットされましたが、オブジェクト コンテキストの更新中にエラーが発生しました。ObjectContext が矛盾した状態にある可能性があります。
内部例外メッセージ:
オブジェクトのキー値が ObjectStateManager 内の別のオブジェクトと競合するため、AcceptChanges を続行できません。
AcceptChanges を呼び出す前に、キー値が一意であることを確認してください。

何かアドバイス?

ストアド プロシージャの例を編集

@nextNumber int を宣言

SELECT @nextNumber = value + 1 FROM SEQUENTIAL_TABLE WHERE location = @location および type=@type

INSERT INTO TABLE (location, type, id ,......) VALUES (@location, @type,@nextnumber, .......)

UPDATE SEQUENTIAL_TABLE SET 値 = @nextNumber WHERE 場所 = @location およびタイプ =@type

@nextNumber を [NextNumber] として選択

4

3 に答える 3

1

デザインについて詳しく知らなくても。ID が主キーではなく、ID/場所/タイプのセットを複合キーとして使用するようにテーブルを変更できます。

于 2012-05-15T22:01:01.393 に答える
0

「偽の負の数」は素晴らしいトリックであり、DataSet / TableAdapter の時代には非常にうまく機能していました。それがうまくいかない場合、これは競合状態である可能性があり、自分の ID をインクリメントして挿入するまで、他のスレッド / 行が次の ID を取得できないように、詳細をトランザクションに配置する必要があります。

于 2012-05-23T06:04:21.877 に答える
0

「自動インクリメントint」を意味するだけでなく、id列を誤用しているようです。

于 2012-05-15T20:55:40.940 に答える