【问题标题】:Entity Framework Extensions: BulkMerge with update statement实体框架扩展:带有更新语句的 BulkMerge
【发布时间】:2019-10-18 19:59:37
【问题描述】:

在使用实体框架扩展的 BulkMerge 时,有什么方法可以运行更新语句? 例如,如果记录存在,则将数据库中的当前值加上参数列表中的值相加。如果记录不存在,则将参数列表的值插入数据库中。

我正在寻找可以包含的内容,例如 (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...

【问题讨论】:

标签: c# entity-framework entity-framework-extensions


【解决方案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 个字段,但如您所见,您可以使用任何类型的公式。使用DestinationTableStagingTable 别名很重要

目标表

DestinationTable 是将更新数据的表。所以你的例子中的TARGET 表。

暂存表

StagingTable 是从中获取数据以进行更新的表。所以你的例子中的SOURCE 表。

【讨论】:

  • 您知道合并不适用于 Oracle 吗?它与 SQL Server 一起工作得很好,但在 oracle 中它只是进行插入,但不更新。我会在 github 上升合适的票。
  • 谢谢@menta,不,我们不知道。您是第一个报告的,我们将根据您打开的问题进行查看。
猜你喜欢
  • 2010-10-13
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多