将数据插入DbContext saveChanges异常

时间:2013-08-30 15:12:49

标签: c# entity-framework sqlite

我正在尝试在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;
}   

2 个答案:

答案 0 :(得分:4)

您需要将其从上下文中删除。您正在收到异常,但实体仍然“添加”到上下文中。所以下次你SaveChanges()时,你会得到同样的例外。

选项1:

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;
}  

选项2(首选):

我真的建议你甚至不要尝试添加已存在的实体。

您可以在添加逻辑之前执行此操作:

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);
}