349 votes

Cadre d'entité. Supprimer toutes les lignes du tableau

Comment puis-je supprimer rapidement toutes les lignes d'un tableau à l'aide d'Entity Framework?

J'utilise actuellement:

 var rows = from o in dataDb.Table
           select o;
foreach (var row in rows)
{
    dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
 

Cependant, l'exécution prend beaucoup de temps.

Y a-t-il des alternatives?

362voto

Ron Sijm Points 2768

Pour ceux qui googuent cela et se sont retrouvés ici comme moi, voici comment vous le faites actuellement dans EF5 et EF6:

 context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
 

En supposant que le contexte est un System.Data.Entity.DbContext

246voto

Ade Alejo Points 323

Permettez-moi de prendre des photos à ceci:

À croire que personne n'aimerait être à Moteur SQL(R/DBM) spécifiques. J'ai continué à faire quelques suppositions:

Depuis la suppression de/suppression de toutes les lignes est le but. Ses plus probable qu'il ne sera pas fait si souvent. Et si elle l'est, c'est probablement un petit jeu de données.

Puis de performance "ne devrait pas" être un tel problème, Et nous pouvons tout simplement:

public class VotingContext : DbContext
{
    public DbSet<Poll> Polls{get;set;}
    public DbSet<Vote> Votes{get;set;}
    public DbSet<Voter> Voters{get;set;}
    public DbSet<Candidacy> Candidates{get;set;}
}

VotingContext.Votes.RemoveRange(VotingContext.Votes)

ce qui peut être fait "mieux" via:

public static void Clear<T>(this DbSet<T> dbSet)
{
    dbSet.RemoveRange(dbSet)
}

Ensuite, nous pouvons:

VotingContext.Votes.Clear();
VotingContext.Voters.Clear();
VotingContext.Candidacy.Clear();
VotingContext.Polls.Clear();
await VotingTestContext.SaveChangesAsync();

J'ai récemment utilisé cette approche pour nettoyer ma base de données de test pour chaque cas de test à exécuter (il est plus rapide que de les recréer la DB de scrath à chaque fois, même si je n'ai pas de vérifier la forme de la suppression des commandes qui ont été générés).

Cheers! ;)

91voto

Rudi Visser Points 11599

L'utilisation de la commande TRUNCATE TABLE SQL sera la plus rapide car elle fonctionne sur la table et non sur des lignes individuelles.

 dataDb.ExecuteStoreCommand("TRUNCATE TABLE [Table]");
 

En supposant que dataDb est un DbContext (pas un ObjectContext ), vous pouvez l'envelopper et utiliser la méthode comme ceci:

 var objCtx = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)dataDb).ObjectContext;
objCtx.ExecuteStoreCommand("TRUNCATE TABLE [Table]");
 

49voto

user3328890 Points 71
var all = from c in dataDb.Table select c;
dataDb.Table.RemoveRange(all);
dataDb.SaveChanges();

40voto

Manish Mishra Points 6073
 using (var context = new DataDb())
{
     var ctx = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)context).ObjectContext;
     ctx.ExecuteStoreCommand(DELETE FROM [TableName] WHERE Name= {0}", Name);
}
 

ou

 using (var context = new DataDb())
{
     context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X