sql - 使用实体框架插入大量重复数据
问题描述
我.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 = ON
with 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 = ON
inEnsureSeedData
函数,代码如下
context.Database.ExecuteSqlCommand("ALTER INDEX [IX_HData_Value] ON [dbo].[HData] REBUILD WITH (IGNORE_DUP_KEY = ON)");
context.SaveChanges();
解决方案
您可以使用条件创建一个循环,直到所有记录的计数。并使用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.
}
}
推荐阅读
- python - 在 Tkinter 文本中撤消和重做时如何保留样式信息(标签)?
- react-native - 输入文本时搜索栏未触发
- c# - 具有相同 DI 容器的多个主机
- javascript - 合并两个对象数组,但将第二个数组推入对象键
- java - 如何在运行时之前验证可变参数到 RPC 调用?
- visualvm - 使用 jstatd 设置 visualvm 远程 JVM 连接时的各种问题
- typescript - 是否可以将泛型传递给标记函数?
- mysql - 在 Sun Unix 上为 Perl 安装 DBD::mysql 时出现问题
- express - Multer (Express) handle error if I use multer as a middleware function before express-validator middleware
- angular - 在 Angular (7+) 中测试可选的构造函数参数