Расширения Entity Framework: BulkMerge с оператором обновления - PullRequest
0 голосов
/ 18 октября 2019

Есть ли способ запустить оператор обновления при использовании BulkMerge из Entity Framework Extensions? Например, если запись существует, суммируйте текущее значение в базе данных плюс значение в списке параметров. Если запись существует, просто вставьте значение списка параметров в базу данных.

Я ищу что-то, что можно включить, например (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 Ответ

0 голосов
/ 18 октября 2019

Да, можно добавить жестко закодированную формулу.

Вот пример с использованием 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 в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...