Como posso remover rapidamente todas as linhas da tabela usando o Entity Framework?
Atualmente, estou usando:
var rows = from o in dataDb.Table
select o;
foreach (var row in rows)
{
dataDb.Table.Remove(row);
}
dataDb.SaveChanges();
No entanto, leva muito tempo para ser executado.
Existem alternativas?
c#
sql
linq
entity-framework
Zhenia
fonte
fonte
TRUNCATE
adeptos se preocupa com restrições de chave estrangeira.[TableName]
, ela não é portátil.Respostas:
Para aqueles que pesquisam isso no Google e acabaram aqui como eu, é assim que você faz atualmente no EF5 e EF6:
Assumindo que o contexto é um
System.Data.Entity.DbContext
fonte
[
fugas aqui sejam específicas para o SQL Server, oTRUNCATE
comando não é - faz parte do ANSI SQL e, portanto, funcionará na maioria dos dialetos SQL (embora não seja SQLite).Aviso: O seguinte é adequado apenas para tabelas pequenas (pense <1000 linhas)
Aqui está uma solução que usa a estrutura da entidade (não o SQL) para excluir as linhas, portanto, não é específico do SQL Engine (R / DBM).
Isso pressupõe que você esteja fazendo isso para testes ou situações semelhantes. Ou
Basta ligar para:
Assumindo este contexto:
Para código mais organizado, você pode declarar o seguinte método de extensão:
Então o acima se torna:
Recentemente, usei essa abordagem para limpar meu banco de dados de teste para cada execução do caso de teste (é obviamente mais rápido do que recriar o banco de dados a partir do zero a cada vez, embora eu não tenha verificado a forma dos comandos de exclusão que foram gerados).
Por que isso pode ser lento?
Portanto, se você estiver trabalhando com uma quantidade séria de dados, você matará o processo do servidor SQL (ele consumirá toda a memória) e a mesma coisa para o processo IIS, já que o EF armazenará todos os dados da mesma maneira que o servidor SQL. Não use este se sua tabela contiver uma quantidade séria de dados.
fonte
O uso do
TRUNCATE TABLE
comando SQL será o mais rápido, pois opera na tabela e não em linhas individuais.Supondo que
dataDb
seja umDbContext
(não umObjectContext
), você pode agrupá-lo e usar o método como este:fonte
TRUNCATE TABLE
paraDELETE FROM
fonte
ou
fonte
Delete
emIQueryable
- Eu estou supondo Manish estava usando algo como EntityFramework.Extended: github.com/loresoft/EntityFramework.Extended.Delete
era uma extensão personalizada e, no calor de postar a resposta primeiro, esqueci totalmente de mencionar a definição desse costume.Delete
. :)Você pode fazer isso sem o Foreach
Isso removerá todas as linhas
fonte
Isso evita o uso de qualquer sql
fonte
Me deparei com essa pergunta quando tive que lidar com um caso específico: atualização completa do conteúdo em uma tabela "folha" (sem FKs apontando para ele). Isso envolveu a remoção de todas as linhas e a colocação de novas informações sobre as linhas, e isso deve ser feito de maneira transacional (não quero terminar com uma tabela vazia, se as inserções falharem por qualquer motivo).
Eu tentei a
public static void Clear<T>(this DbSet<T> dbSet)
abordagem, mas novas linhas não são inseridas. Outra desvantagem é que todo o processo é lento, pois as linhas são excluídas uma a uma.Então, mudei para
TRUNCATE
abordagem, pois é muito mais rápido e também é ROLLBACKable . Também redefine a identidade.Exemplo usando padrão de repositório:
Obviamente, como já mencionado, esta solução não pode ser usada por tabelas referenciadas por chaves estrangeiras (TRUNCATE falha).
fonte
Cannot truncate table because it is being referenced by a FOREIGN KEY constraint
), mesmo que estejam vazias, portanto, os FKs devem ser descartados e recriados para serem usados deTRUNCATE
qualquer maneira.E se
causas
Não é possível truncar a tabela 'MyTable' porque está sendo referenciada por uma restrição FOREIGN KEY.
Eu uso isso :
fonte
fonte
Se você deseja limpar todo o banco de dados.
Devido às restrições de chave estrangeira, é importante qual sequência as tabelas estão truncadas. Essa é uma maneira de forçar brutais essa sequência.
uso:
lembre-se de restabelecer seu DbContext depois disso.
fonte
O seguinte funciona no banco de dados SQLite (usando o Entity Framework)
Parece que a maneira mais rápida de limpar todas as tabelas db é usando 'context.Database.ExecuteSqlCommand ("some SQL")', como destacaram alguns comentários acima. Aqui vou mostrar como redefinir a contagem de tabelas do 'índice'.
Um ponto importante é que, se você usar chaves estrangeiras em suas tabelas, deverá primeiro excluir a tabela filha antes da tabela pai, para que a sequência (hierarquia) de tabelas durante a exclusão seja importante, caso contrário, uma exceção SQLite poderá ocorrer.
Nota: var context = new YourContext ()
fonte
Isso funciona corretamente no EF 5:
fonte
No EFCore (a versão que estou usando é 3.1), você pode usar o seguinte para remover todas as linhas -
fonte
Exclua todos os registros. Não redefina o índice primário como "truncar".
fonte
No meu código, eu realmente não tinha bom acesso ao objeto Database, então você pode fazê-lo no DbSet, onde você também pode usar qualquer tipo de sql. Vai acabar assim:
fonte
Se MVC, você pode fazer:
fonte
Certifique-se de que, ao tentar excluir os pais, todos os filhos se conectem em cascata ao excluir. Ou os filhos têm chave estrangeira anulável.
fonte
fonte