You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用BulkInsert迁移数据库时保留主键的问题

解决Dapper Plus BulkInsert保留原主键ID的问题

你遇到的核心问题是SQL Server默认不允许向自增标识列显式插入值,而AllowUpdatePrimaryKeys选项仅用于更新操作时允许修改主键,和插入场景无关。要保留原SQLite的主键ID,需要同时开启SQL Server的IDENTITY_INSERT并在Dapper Plus中配置对应选项。

解决方案步骤:

  • 确认SQL Server目标表的主键是自增标识列(IDENTITY),这是操作的前提。
  • 在BulkInsert操作前后,分别开启和关闭目标表的IDENTITY_INSERT(SQL Server强制要求显式执行该步骤)。
  • 在Dapper Plus的BulkOptions中设置IdentityInsert = true,告知工具允许向标识列插入自定义值。

修改后的代码示例:

using IDbConnection connection = new SqlConnection(_sqlServerConnectionString);

// 开启IDENTITY_INSERT权限
connection.Execute("SET IDENTITY_INSERT DataSources ON");

try
{
    connection.UseBulkOptions(o =>
    {
        o.IdentityInsert = true; // 关键配置:允许插入标识列自定义值
    }).BulkInsert(dataSources);
}
finally
{
    // 无论操作成败,必须关闭IDENTITY_INSERT
    connection.Execute("SET IDENTITY_INSERT DataSources OFF");
}

额外补充:

  • 如果实体类主键未通过[Key]或[Identity]特性标记,需手动指定主键映射:
    connection.UseBulkOptions(o =>
    {
        o.IdentityInsert = true;
    }).BulkInsert<DataSources>(dataSources, opt => opt.MapKey(x => x.Id));
    
  • AllowUpdatePrimaryKeys仅对BulkUpdate或BulkMerge操作生效,用于允许修改已存在数据的主键值,完全不影响插入逻辑。

内容的提问来源于stack exchange,提问作者BoilermakerRV

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:03:13