批量插入数据实体框架7

时间:2016-02-25 10:53:45

标签: c# asp.net-core 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();
    }

我知道这是非常糟糕的做法。通过插入大量数据,性能将非常缓慢

针对此问题的任何解决方案?

1 个答案:

答案 0 :(得分:0)

在每次添加后调用“SaveChanges”可能无法修复您看到的异常消息。问题的根本原因是您的DbContext实例已经有一个具有相同密钥的ApplicationUserRole实体(猜测它是ApplicationUserRole.Id或其他东西)。 This error is common并且通常是由手动设置临时密钥值引起的,例如将ApplicationUserRole.Id设置为-1。 (例如,请参阅https://github.com/aspnet/EntityFramework/issues/4488。)

如果错误是由错误设置临时密钥值引起的,那么还要确保您的DbContext实例是短暂的并且仅在一个线程中使用。换句话说,仅使用DbContext进行一次操作。

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