2013-06-24 2 views
1

В моем файле данных семени я сначала удаляю все записи в конкретном объекте, а затем добавляю новый. Однако я чувствую, что код для удаления данных может быть улучшен (или очищен).Вспомогательная функция для удаления/удаления всех данных сущности, EF

В настоящее время я делаю так:

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)); 
} 

Было бы очиститель таким образом. Какие-либо предложения?

+0

Возможно, было бы лучше спросить об этом в обзоре кода. – dandan78

+0

Спасибо, что поделились сайтом @ dandan78. Новые для меня. – Rohit

ответ

5

Удаление большого количества данных с помощью EF очень неэффективно. Сначала он загружает все объекты из базы данных, а затем удаляет их один за другим.

Использование сырой SQL вместо:

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

Это сделает только один вызов к базе данных, и пусть DB делать все удаление за один шаг, который является гораздо более эффективным. Если задействованные таблицы являются большими, то, возможно, стоит использовать TRUNCATE TABLE, чтобы получить некоторую производительность.

+0

Это настоящее решение. Другие трюки будут извлекать все строки и удалять их по одному. – Damien

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>() 

, если вы хотите удалить все пользователи тогда.

+0

Перечисления являются действительными объектами в EF. Требуется ли ограничение? –

+0

ах да перечисления, забыли об этом. Я думаю, вы можете удалить класс T:. – Maximc

+0

@Maximc. Спасибо, вы можете отредактировать свой пост: это должен быть вызов метода здесь context.Set () .ToList(); вместо context.Set .ToList() ;. Похоже на опечатку – Rohit

1

Я бы предложил использовать sql здесь. То, как вы это делаете, - это интенсивность данных, так как EF загружает каждый из этих объектов, а затем удаляет их. Очень дорого.

Просто напишите sql "delete from CertLevelValues" или обрезайте таблицу.

Значительно быстрее, особенно с большим набором данных.