我正在尝试处理批量插入过程中可能存在具有相同主键的实体的情况,这当然会使SaveChanges抛出异常。
这是我所拥有的:
try
{
_context.SaveChanges();
_context.Dispose();
_context = null;
_context = SelectContext<T>();
_commitCount = 0;
}
catch (System.Data.UpdateException updateEx)
{
//Remove from _context all the entries that errored in the SaveChange() process...
if (updateEx.StateEntries != null)
{
foreach (ObjectStateEntry stateEntry in updateEx.StateEntries)
{
if ((System.Data.EntityState)stateEntry.Entity.GetType().GetProperty("EntityState").GetValue(stateEntry.Entity, null) != System.Data.EntityState.Detached)
{
_context.Detach(stateEntry.Entity);
}
}
}
//Save context changes again this time without erroneous entries...
try
{
_context.SaveChanges();
_context.Dispose();
_context = null;
_context = SelectContext<T>();
_commitCount = 0;
}
catch (Exception ex)
{
//Welp, at the point, I'm clueless...
}
如果我查看 ObjectStateManager,实体确实被删除了(计数随着 foreach 循环的迭代次数而下降。)
但它仍然在第二次尝试时抛出异常,抱怨欺骗 PK。
我认为分离一个实体是一样的,如果它从一开始就没有出现在上下文中。我需要做其他事情吗?
谢谢。