通常在我以前的项目中,我可以通过传递一个对象列表作为下面的代码来进行批量插入
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();
}
我知道这是非常糟糕的做法。通过插入大量数据,性能将非常缓慢
针对此问题的任何解决方案?
答案 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();
}
}