1

私のシード データ ファイルでは、最初に特定のエンティティのすべてのエントリを削除してから、新しいエントリを追加しています。ただし、データを削除するためのコードは改善 (またはクリーン) できると思います。

現在、私は次のようにしています:

 var oldCertCat = context.CertCategoryValues.ToList();
 oldCertCat.ForEach(cat => context.CertCategoryValues.Remove(cat));

次のエンティティ:

 var oldCertLevel = context.CertLevelValues.ToList();
 oldCertLevel.ForEach(certLevel => context.CertLevelValues.Remove(certLevel));

次のようなヘルパー関数を作成することを考えています。

void DeleteData("EntityName")
{
    var oldData = context."EntityName".ToList();
    oldData.ForEach(item => context."EntityName".Remove(item));
}

この方法でよりきれいになります。助言がありますか?

4

3 に答える 3

5

EF で大量のデータを削除するのは非常に非効率的です。最初にデータベースからすべてのエンティティをロードし、次にそれらを 1 つずつ削除します。

代わりに生の SQL を使用します。

void Deletedata(string tableName)
{
  context.Database.ExecuteSqlCommand("DELETE FROM {0}", tableName);
}

データベースへの呼び出しを 1 回だけ行い、DB が 1 つのステップで全体の削除を実行できるようにするため、はるかに効率的です。関連するテーブルが大きい場合、TRUNCATE TABLEパフォーマンスを向上させるために代わりに使用する価値があるかもしれません。

于 2013-06-24T15:11:52.320 に答える
1

ここでは sql を使用することをお勧めします。EF はこれらの各エンティティを読み込んでから削除するため、これを行う方法はデータ集約的です。非常に高価です。

SQL「delete from CertLevelValues」を記述するか、テーブルを切り捨てます。

特に大規模なデータセットで大幅に高速化。

于 2013-06-24T15:11:15.667 に答える
1

あなたはジェネリックでそれを行うことができます

void DeleteData<T>() where T : class
{
    var oldData = context.Set<T>().ToList();
    oldData.ForEach(item => context.Set<T>().Remove(item));
    context.SaveChanges();
}

次に、次のように呼び出すことができます。

 DeleteData<User>()

すべてのユーザーを削除する場合。

于 2013-06-24T15:09:59.730 に答える