12

Ordinal 列を持つテーブルに一意のインデックスを持つテーブルがあります。たとえば、テーブルには次の列があります。

TableId、ID1、ID2、序数

一意のインデックスは、ID1、ID2、序数の列にまたがっています。

私が抱えている問題は、データベースからレコードを削除するときに、序数を再配列して、再び連続するようにすることです。私の削除機能は次のようになります。

    public void Delete(int id)
    {
        var tableObject = Context.TableObject.Find(id);
        Context.TableObject.Remove(tableObject);
        ResequenceOrdinalsAfterDelete(tableObject);
    }

問題は、 Context.SaveChanges() を呼び出すと、ステートメントが渡された順序とは異なる順序で実行されるように見えるため、一意のインデックスが壊れることです。たとえば、次のことが起こります。

  1. 序数の並べ替え
  2. レコードを削除する

それ以外の:

  1. レコードを削除する
  2. 序数の並べ替え

これは EF の正しい動作ですか? もしそうなら、この動作をオーバーライドして実行順序を強制する方法はありますか?

うまく説明できていなかったら、教えてください...

4

1 に答える 1

13

コマンドの順序は完全に EF の制御下にあります。順序に影響を与える唯一の方法は、操作ごとに個別の SaveChanges を使用することです。

public void Delete(int id)
{
    var tableObject = Context.TableObject.Find(id);
    Context.TableObject.Remove(tableObject);
    Context.SaveChanges();
    ResequenceOrdinalsAfterDelete(tableObject);
    Context.SaveChanges();
}

また、原子性を確保するために、手動で作成されたトランザクションでそのコードを実行する必要があります (=> TransactionScope)。

ただし、再順序付けでは、影響を受けるすべてのレコードをデータベースからアプリケーションにプルし、序数を変更して、データベースに 1 つずつ保存する必要があるため、おそらくストアド プロシージャを使用するのが最善の解決策です。

ところで。データベースの匂いでこれを行います。「順序」シーケンスにギャップがあることの問題は何ですか?

于 2011-09-07T14:48:14.010 に答える