У меня есть таблица со 100 000 + записями. Клиент попросил, чтобы мы зашифровали поле имени пользователя, скопировали зашифрованное значение в новое поле и очистили исходное имя пользователя. Шифрование может выполняться только в приложении, а не в базе данных.Альтернатива массовому обновлению с помощью платформы Entity Framework
Существующая кодовая база ранее использовала Entity Framework для этих задач, но никогда не для таблицы такого размера. Наследство коды выглядели что-то вроде:
foreach(var phone in db.Phones){
phone.Enc_Serial = Encrypt(phone.Serial);
phone.Serial = "";
}
db.SaveChanges();
Учитывая это массовое обновление, будет ли какое-то преимущество, чтобы сделать это с помощью команды SQL сырой? Я думаю, что, по крайней мере, у нас не было бы тонны отслеживаемых объектов, сидящих в потребляющей памяти DbContext
.
var idsAndSerials = db.Phones.Select(p => new { id = p.Id, serial = p.Serial };
foreach(var item in idsAndSerials){
string sql = String.Format("Update phone set Enc_Serial ='{0}' where phoneId={1}", Encrypt(item.serial), item.id.ToString());
db.Database.ExecuteSqlCommand(sql);
}
Из любопытства, почему это имеет значение? Ваш унаследованный метод не может работать в достаточном количестве времени? Профилировали ли вы разницу между двумя методами для записей 1k? –
Цикл foreach для одного обновления одновременно занимает много времени. Я бы посоветовал построить таблицу на конце C#, а затем вставить ее в таблицу Temp в базе данных и затем запустить одно обновление. – Hozikimaru
Если вы сделаете это с помощью «* Raw SQL command *», то технически вы будете выполнять шифрование в базе данных и * не * в приложении. (Так как команды SQL запрошены * клиентом, но фактически * выполнены * сервером СУБД). – RBarryYoung