バルク挿入データエンティティフレームワーク7

asp.net-core c# entity-framework-core

質問

通常私の以前のプロジェクトでは、以下のコードでオブジェクトのリストを渡すことで一括挿入を行うことができます

public void Create(List<ApplicationUserRole> item)
{           
        foreach (var data in item)
        {
            _dbContext.ApplicationUserRole.Add(data);
        }
        _dbContext.SaveChanges();           
}

しかし今のところ私は誤りを打ち続ける

InvalidOperationException:エンティティタイプ 'Docdoc.Models.ApplicationUserRole'のインスタンスは、同じキーを持つこのタイプの別のインスタンスがすでに追跡されているため、追跡できません。新しいエンティティについては、IIdentityGeneratorを使用して一意のキー値を生成することを検討してください。

下のコードを変更する必要があります

    foreach (var data in item)
    {
        _dbContext.ApplicationUserRole.Add(data);
        _dbContext.SaveChanges();
    }

それは非常に悪い習慣であることがわかっています大量のデータを挿入するとパフォーマンスが非常に遅くなります

この問題の解決策はありますか?

受け入れられた回答

あなたが見た例外メッセージは、各追加の後で "SaveChanges"を呼び出すことで修正されないことがあります。問題の根本的な原因は、DbContextのインスタンスに既に同じキーを持つApplicationUserRoleエンティティがあることです(ApplicationUserRole.Idなどと推測されます)。 このエラーは一般的であり、一時的なキー値を手動で設定することによってよく発生します。たとえば、ApplicationUserRole.Idを-1に設定します。 (たとえば、 https://github.com/aspnet/EntityFramework/issues/4488を参照してください )。

一時キーの値を誤って設定してもエラーが発生していない場合は、DbContextのインスタンスが短命で、1つのスレッドでのみ使用されていることを確認してください。言い換えると、DbContextは1回の操作にのみ使用します。

public void Create(List<ApplicationUserRole> item)
{         
    using (var context = new MyContext())
    {  
        context.ApplicationUserRole.AddRange(data);
        context.SaveChanges();  
    }         
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ