当数据不包括主键时使用EFCore.Bulk扩展执行UPSERT的有效方法 [英] Efficient way to perform an UPSERT with EFCore.BulkExtensions when data does not include primary key

查看:30
本文介绍了当数据不包括主键时使用EFCore.Bulk扩展执行UPSERT的有效方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要通过API将批量数据上传到数据库中,我正在考虑使用EFCore.BulkExtensions。遗憾的是,数据将不包括自动生成的主键(Id)。

但是,我们有一个将包括在数据中的唯一复合键。我确实需要将Id作为模型中的键属性,因为我将需要它用作几个子项的外键(我已经能够使用IncludeGraph批量插入父项和子项,尽管我无法为BulkUpdate或BulkInsertOrUpdate设置它-请参见下面的内容)。

当我没有主键时,处理更新的最有效方法是什么?我是否应该使用BulkRead根据唯一的组合键获取ID,选择所有3个字段,然后将其映射到记录列表中?或者是否有其他方法来处理此问题(可能类似于实体框架扩展的ColumnPrimaryKeyExpression)。

当父记录是更新时,如果子记录也是Upsert,是否会有问题?这些记录缺少主键和唯一组合键的问题与我处理父项时的问题相同。

提前谢谢!

推荐答案

我建议寻找替代方案。例如,linq2db.EntityFrameworkCore拥有与批量操作相关的所有功能。请注意,我是创建者之一。

如何插入或更新百万行:

var items = ...

using var db = context.CreateLinqToDBConnection();

// temporary table will be crated and items will be inserted as fast as possible
using var temp = db.CreateTempTable(items);

var destinationTable = context.SomeTable.ToLinqToDBTable();
// or
var destinationTable = db.GetTable<SomeTable>();

destinationTable
    .Merge()
    .Using(temp)
    .On((target, source) => target.SomeValue == source.SomeValue)
    .InsertWhenNotMatched(source => new SomeTable
    {
        SomeValue = source.SomeValue
        ... // other fields
    })
    .UpdateWhenMatched((target, source) => new SomeTable
    {
        OtherValue = source.OtherValue 
        ... // other fields
    })
    .Merge();

这篇关于当数据不包括主键时使用EFCore.Bulk扩展执行UPSERT的有效方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆