我将.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();
答案 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 }));