3

Старый вопрос для Linq 2 Entities. Я просто прошу об этом еще раз, если кто-то придумает решение.Обновление нескольких строк без выбора

Я хочу, чтобы выполнить запрос, который делает это:

UPDATE dbo.Products WHERE Category = 1 SET Category = 5 

И я хочу сделать это с Entity Framework 4.3.1.

Это всего лишь пример, у меня есть тонны записей. Мне просто нужно, чтобы 1 столбец менял значение, ничего больше. Загрузка в DbContext с помощью Where (...). Выберите (...), изменив все элементы, а затем сохраните с помощью SaveChanges(), для меня это не сработает.

Должен ли я придерживаться ExecuteCommand и отправлять прямой запрос, как написано выше (конечно, сделать его многоразовым) или есть еще один хороший способ сделать это от Linq 2 Entities/Fluent.

Спасибо!

+0

вы можете описать, что именно Безразлично Работа для вас или как это не работает? Может быть, образец кода того, что вы пробовали, и как он провалился? –

+0

Нет ничего, что «не удалось». Это вопрос производительности, что я не уверен в выполнении EF. Я прошу подтверждения, если я прав, или есть что-то, что я пропустил :) –

ответ

0

Вы можете обновить объект без первой выборки его из БД, как показано ниже

using (var context = new DBContext()) 
{ 
    context.YourEntitySet.Attach(yourExistingEntity); 

    // Update fields 

    context.SaveChanges(); 
} 
+0

извините, это не решение для вашего вопроса, я не понял вопрос хорошо – Yucel

0

операции Если вы установили на основе, то SQL лучше подходит, чем EF.

Итак, да - в этом случае вы должны придерживаться ExecuteCommand.

1

То, что вы описываете, на самом деле невозможно с Entity Framework. У вас есть несколько вариантов,

  1. Вы можете записать его в виде строки и выполнить его с помощью EF с .ExecuteSqlCommand (по контексту)
  2. Вы можете использовать что-то вроде Entity Framework Extended (однако от того, что ив видели это оленья кожа имеет большой производительность)
0

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

using(var dc = new YourDataContext()) 
{ 
    dc.UpdateProductsCategory(1, 5); 
} 

где UpdateProductsCategory бы имя импортируемого хранимой процедуры.

0

Да, ExecuteCommand() определенно способ сделать это, не получая данные всех строк и не позволяя ChangeTracker разобраться. Просто чтобы дать пример:

приведет к всем строкам являются неправдоподобными и обновление выполняется для каждой строки изменено:

using (YourDBContext yourDB = new YourDBContext()) { 
     yourDB.Products.Where(p => p.Category = 1).ToList().ForEach(p => p.Category = 5); 
     yourDB.SaveChanges(); 
    } 

Только одно обновления:

using (YourDBContext yourDB = new YourDBContext()) { 
     var sql = "UPDATE dbo.Products WHERE Category = @oldcategory SET Category = @newcategory"; 
     var oldcp = new SqlParameter { ParameterName = "oldcategory", DbType = DbType.Int32, Value = 1 }; 
     var newcp = new SqlParameter { ParameterName = "newcategory", DbType = DbType.Int32, Value = 5 }; 
     yourDB.Database.ExecuteSqlCommand(sql, oldcp, newcp); 
    } 
Смежные вопросы