当数据不包括主键时使用EFCore.Bulk扩展执行UPSERT的有效方法 [英] Efficient way to perform an UPSERT with EFCore.BulkExtensions when data does not include primary key
本文介绍了当数据不包括主键时使用EFCore.Bulk扩展执行UPSERT的有效方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要通过API将批量数据上传到数据库中,我正在考虑使用EFCore.BulkExtensions
。遗憾的是,数据将不包括自动生成的主键(Id
)。
Id
作为模型中的键属性,因为我将需要它用作几个子项的外键(我已经能够使用IncludeGraph批量插入父项和子项,尽管我无法为BulkUpdate或BulkInsertOrUpdate设置它-请参见下面的内容)。
当我没有主键时,处理更新的最有效方法是什么?我是否应该使用BulkRead根据唯一的组合键获取ID,选择所有3个字段,然后将其映射到记录列表中?或者是否有其他方法来处理此问题(可能类似于实体框架扩展的ColumnPrimaryKeyExpression
)。
提前谢谢!
推荐答案
我建议寻找替代方案。例如,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屋!
查看全文