9

私は、序数の列を持つテーブルに一意のインデックスを持つテーブルを持っています。したがって、たとえば、テーブルには、次の列があります:DbContext SaveChangesステートメントの実行順序

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. がレコードに

代わりの削除は、resequence:

  • は序をリシーケンスレコードを削除します

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

    私はこれを適切に説明していない場合は、コマンドの

  • 答えて

    9

    注文が完全にEFの制御下にある...私に教えてください。あなたは順番にどのように影響するか唯一の方法は、すべての操作のために別々のSaveChangesメソッドを使用している:

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

    あなたはまた、アトミック(=>TransactionScope)を確保するために、手動で作成したトランザクションでそのコードを実行する必要があります。

    しかし、resequencingは、データベースからアプリケーションに影響を受けるすべてのレコードをアプリケーションにプルし、序数を変更してデータベースに戻す必要があるため、おそらくストアドプロシージャを使用することになります。

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

    +0

    返信いただきありがとうございます。私は以前これをデータベースで実装しています。コードは恐ろしいもので、苦痛だったのですが、これは管理セクションからしかアクセスできず、わずかな量が変更されます。序数が再順序付けされる主な理由は、管理ユーザーがいくつかのテーブルで順序を設定し、ギャップを見つけたときに困惑したり混乱してしまうことです。EFがあなたが提供する順序で実行されないバマーのビット。 – didiHamman