0

DbContext我正在尝试在我的(SQLite DB)中添加大量数据。我想要的是添加 x 数量的数据,如果其中一些已经存在,请忽略它们。所以例如:添加100,2已经存在,添加98项。

首先,我对所有这些进行了插入,然后调用saveChanges(),但这会恢复所有插入。因此我将其更改saveChanges()为 for 循环,但我遇到了同样的问题。

异常后我需要清除一些东西吗?

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

2 回答 2

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 语句进行的。这比错误地插入几条记录要快得多。

于 2013-08-30T15:22:25.633 回答
3

您不能在添加之前测试该项目是否已经存在吗?

if(!_db.Cars.Any(c => c == t))
{
   _db.Cars.Add(t);
}

 

于 2013-08-30T15:16:05.200 回答