使用实体框架插入大量重复数据

时间:2018-08-16 06:19:29

标签: sql entity-framework-core

我将.NET Core 2.0与Entity Framework Code First一起使用。我有一个表“ HData”,具有以下几个属性:Id(PK),Value(忽略重复键设置的索引)和Time。该表可能包含10,000,000+个条目。

我插入成千上万个这样的条目:

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

我已经使用SQL命令设置了IGNORE_DUP_KEY = ON,但是当代码运行到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 = ON函数中设置了EnsureSeedData,下面的代码

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

2 个答案:

答案 0 :(得分:0)

您可以使用条件创建循环,直到所有记录计数。 并使用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.
  }
}

答案 1 :(得分:0)

如果您只想插入唯一值,则可以这样做

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