Quelle est la meilleure façon de supprimer tous les éléments d'un System.Data.Entity.DbSet, avec Entity Framework 4.3?
Réponses
Trop de publicités?dbContext.Database.ExecuteSqlCommand("delete from MyTable");
(Sans blague.)
Le problème est que les EF ne prend pas en charge toutes les commandes de traitement par lots et la seule façon de supprimer toutes les entités dans un jeu utilisant pas directement DML serait:
foreach (var entity in dbContext.MyEntities)
dbContext.MyEntities.Remove(entity);
dbContext.SaveChanges();
Ou peut-être un petit peu moins cher pour éviter de charger plein d'entités:
foreach (var id in dbContext.MyEntities.Select(e => e.Id))
{
var entity = new MyEntity { Id = id };
dbContext.MyEntities.Attach(entity);
dbContext.MyEntities.Remove(entity);
}
dbContext.SaveChanges();
Mais dans les deux cas, vous devez charger toutes les entités ou toutes les propriétés de clé et supprimer les entités, un par un à partir de l'ensemble. En outre, lorsque vous appelez SaveChanges
EF enverra n (=nombre d'entités dans le jeu) DELETE à la base de données qui par ailleurs sont exécutées une par une dans la DB (en une seule opération).
Donc, SQL directe est nettement préférable pour cela que vous avez seulement besoin d'une seule instruction DELETE.
Voici une autre façon de le faire dans le code.
public static class Extensions
{
public static void DeleteAll<T>(this DbContext context)
where T : class
{
foreach (var p in context.Set<T>())
{
context.Entry(p).State = EntityState.Deleted;
}
}
}
Pour appeler réellement la méthode et effacer le jeu:
myDbContext.DeleteAll<MyPocoClassName>();