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 に答える