Entity Framework 4.1 Пакетные обновления - PullRequest
3 голосов
/ 01 июня 2011

Я работаю с EF 4.1 и хочу выполнить пакетное обновление для 3 таблиц (для реализации мягкого удаления). Из некоторых быстрых исследований видно, что прямые запросы SQL лучше. Моя реализация ниже, и я надеялся получить некоторые отзывы о том, является ли это наилучшей практикой. Спасибо за помощь ...

using (var scope = new TransactionScope())
{
     using (var db = new TimeCatchDb())
     {

        db.Database.ExecuteSqlCommand("UPDATE EmployeeRecords SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id});

        db.Database.ExecuteSqlCommand("UPDATE Notes SET Deleted = 1 WHERE NoteTypeId = @p0", new SqlParameter { ParameterName = "p0", Value = id });

        db.Database.ExecuteSqlCommand("UPDATE NoteTypes SET Deleted = 1 WHERE Id = @p0", new SqlParameter { ParameterName = "p0", Value = id });
     }

     scope.Complete();
}

Ответы [ 2 ]

13 голосов
/ 08 января 2012

Вы можете расширить ef следующим расширением

Расширенная библиотека Entity Framework

Библиотека расширяет функциональность Entity Framework.

Особенности • Пакетное обновление и удаление • Будущие Запросы • Аудит Журнал Пакет и источник проекта Пакет NuGet

PM> Install-Package EntityFramework.Extended

Пакетное обновление и удаление В настоящее время ограничения Entity Framework заключаются в том, что для обновления или удаления объекта необходимо сначала извлечь его в память. Сейчас в большинстве сценариев это просто отлично. Однако есть некоторые старшие, где производительность пострадает. Кроме того, для одиночных удалений объект должен быть извлечен до того, как он может быть удален, требуя двух вызовов к базе данных. Пакетное обновление и удаление исключает необходимость извлекать и загружать объект перед его изменением.

//delete all users where FirstName matches
context.Users.Delete(u => u.FirstName == "firstname");

//update all tasks with status of 1 to status of 2
context.Tasks.Update(
    t => t.StatusId == 1, 
    t => new Task {StatusId = 2});

//example of using an IQueryable as the filter for the update
var users = context.Users
   .Where(u => u.FirstName == "firstname");

context.Users.Update(
   users, 
   u => new User {FirstName = "newfirstname"})

.

2 голосов
/ 01 июня 2011

Если вам нужна партия, почему бы вам не поместить все обновления в одну ExecuteSqlCommand?Каждый вызов ExecuteSqlCommand совершает свой собственный обход в базу данных = это не пакет.Также имейте в виду, что если какая-либо из измененных записей в данный момент загружена в контекст, изменения не будут отражены = загруженные объекты все равно будут иметь Deleted = 1.Команды Direct SQL влияют только на базу данных.

Это лучше всего достигается в обычном EFv4 + EDMX, если сопоставить пользовательскую хранимую процедуру с операцией Delete (но она также не поддерживает пакеты), но если у вас нет EDMXВы не можете этого сделать.

...