我正在尝试在DbContext
(SQLite数据库)中添加大量数据。
我想要的是添加x数量的数据,如果其中一些已经存在,请忽略它们。例如:添加100,已经存在2,添加了98个项目。
首先我插入了所有这些,然后调用saveChanges()
,但是它还原了所有这些的插入。因此我在for循环中将其更改为saveChanges()
,但我遇到了同样的问题。
我是否需要在异常后清除某些内容?
public int Insert(List<Car> Cars)
{
int addedCars = 0;
foreach (Car t in Cars)
{
_db.Cars.Add(t);
try
{
_db.SaveChanges();
addedCars++;
}
catch (DbUpdateException ex)
{
Console.WriteLine("Whups duplicate entry");
}
}
return addedCars;
}
答案 0 :(得分:4)
您需要将其从上下文中删除。您正在收到异常,但实体仍然“添加”到上下文中。所以下次你SaveChanges()时,你会得到同样的例外。
public int Insert(List<Car> Cars)
{
int addedCars = 0;
foreach (Car t in Cars)
{
_db.Cars.Add(t);
try
{
_db.SaveChanges();
addedCars++;
}
catch (DbUpdateException ex)
{
_db.cars.Remove(t); // Remove it from the context collection
Console.WriteLine("Whups duplicate entry");
}
}
return addedCars;
}
我真的建议你甚至不要尝试添加已存在的实体。
您可以在添加逻辑之前执行此操作:
Cars = Cars.Where(x => !_db.Cars.Any(y => y.ID == x.ID)).ToList();
注意即使这在技术上“检查”了100条记录,但它在内存中使用单个SQL语句。这比错误插入几条记录要快得多。
答案 1 :(得分:3)
在添加项目之前,您是否只能测试该项目是否已存在?
if(!_db.Cars.Any(c -> c == t))
{
_db.Cars.Add(t);
}