Расширения Entity Framework: BulkMerge с оператором обновления
Есть ли способ запустить оператор обновления при использовании BulkMerge из расширений Entity Framework? Например, если запись существует, просуммируйте текущее значение в базе данных плюс значение в списке параметров. Если запись doest существует, просто вставьте значение списка параметров в базу данных.
Я ищу что-нибудь для включения вроде (x => new Animal {Age = x.Age + parameters.Age});
С точки зрения SQL это было бы примерно так:
WHEN MATCHED THEN
UPDATE SET
TARGET.ColumNumber = TARGET.ColumNumber + SOURCE.ColumNumber
WHEN NOT MATCHED BY TARGET THEN
INSERT...
1 ответ
Да, можно добавить жестко запрограммированную формулу.
Вот пример использования PostConfiguration: https://dotnetfiddle.net/s8QF4t
context.BulkMerge(list, options => {
options.PostConfiguration = bulk => {
bulk.ColumnMappings.Single(x => x.SourceName == "Description").FormulaUpdate = "DestinationTable.Name + ';' + StagingTable.Description";
};
});
Вот пример сопоставления всех ваших столбцов: https://dotnetfiddle.net/enOEQF
context.BulkMerge(list, options => {
options.ColumnMappings.Add(new Z.BulkOperations.ColumnMapping<Customer>(x => x.CustomerID, true));
options.ColumnMappings.Add(new Z.BulkOperations.ColumnMapping<Customer>(x => x.Name));
var columnMapping = new Z.BulkOperations.ColumnMapping<Customer>(x => x.Description);
columnMapping.FormulaUpdate = "DestinationTable.Name + ';' + StagingTable.Description";
options.ColumnMappings.Add(columnMapping);
});
Оба примера объединяют 2 поля, но, как видите, вы можете использовать любую формулу. Важно использоватьDestinationTable
а также StagingTable
псевдоним
DestinationTable
DestinationTable - это таблица, в которой будут обновляться данные. Так чтоTARGET
таблица в вашем примере.
StagingTable
StagingTable - это таблица, из которой берутся данные для обновления. Так чтоSOURCE
таблица в вашем примере.