Расширения 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 таблица в вашем примере.

Другие вопросы по тегам