首页 > 解决方案 > 使用实体框架插入大量重复数据

问题描述

.NET Core 2.0首先使用实体​​框架代码。我有一个具有以下几个属性的表“HData”:Id(PK)、值(忽略重复键设置的索引)和时间。此表可能有 10,000,000 多个条目。

我插入数千个这样的条目:

dataList.ForEach(i => db.HData.Add(new HData() { Value = i, Time = some.CreateDateTime }));
db.SaveChanges();

我已经设置了IGNORE_DUP_KEY = ONwith SQL 命令,但是当代码运行到上面时db.SaveChanges,它向我显示了重复的错误消息:

无法在具有唯一索引“IX_HData_Value”的对象“dbo.HData”中插入重复的键行。重复键值为 (abcde)。

我该如何解决它,或者无论如何可以捕捉到这个异常并跳到下一个数据插入?

更新 HData 模型信息

public class HData 
{
    public int Id { get; set; }

    public string Value { get; set; }

    public DateTime Time { get; set; }

}

OnModelCreating:

builder.Entity<HData>(b => {
   b.Property(p => p.Time).HasDefaultValueSql("GETUTCDATE()");
   b.HasIndex(p => p.Value).IsUnique(true).HasFilter(null);});

第三次更新:

我设置了IGNORE_DUP_KEY = ONinEnsureSeedData函数,代码如下

context.Database.ExecuteSqlCommand("ALTER INDEX [IX_HData_Value] ON [dbo].[HData] REBUILD WITH (IGNORE_DUP_KEY = ON)");
context.SaveChanges();

标签: sqlentity-framework-core

解决方案


您可以使用条件创建一个循环,直到所有记录的计数。并使用try-catch。

示例代码:

var data= datalist.count();
for(conditons)
{
   SaveRecord(datalist); // here just pass one data which you have to save
}

function SaveRecord(datalist)
{
  try{
     // Write your save code here.
  }
  catch(Exception ex){
     // don't throw exception.
  }
}

推荐阅读