我在数据上下文中有一个方法,它接受一个对象,调用attach以使其与其数据库条目匹配,刷新并提交我对该对象所做的任何更改。更新第一次工作正常,但当我尝试第二次更新同一条目时,它开始抛出异常。以下是我的更新方法中的内容:
this.GetTable(data.GetType()).Attach(data, false);
this.Refresh(RefreshMode.KeepCurrentValues, data);
this.SubmitChanges();
以下是异常的堆栈跟踪:
System.Data.Linq.DuplicateKeyException: Cannot add an entity with a key that is already in use.
at System.Data.Linq.Table`1.Attach(TEntity entity, Boolean asModified)
at System.Data.Linq.Table`1.System.Data.Linq.ITable.Attach(Object entity, Boolean asModified)
我错过了某种表刷新吗?
答案 0 :(得分:2)
确认data
不是来自this
我怀疑您尝试附加的实例(data
)来自您所附加的相同上下文(即this
)。如果它来自同一个实例,则无需附加(由于更改跟踪,它只会在您SubmitChanges()
时更新。如果上面的代码是方法的一部分,我们称之为AttachAndSave()
,你不能用你从那个上下文中检索到的数据来调用它,或者连续两次使用相同的数据调用它,并尝试将相同的数据附加两次。
如果data
来自其他DataContext,请尝试使用asModified
参数:
this.GetTable(data.GetType())。Attach(data,true);
我怀疑第1点没有帮助,SQL确定您要插入新实例而不是修改现有实例,然后抛出异常,因为您的实例与另一个实例具有相同的主键实例(即您要更新的那个)。但是,这将需要时间戳跟踪字段,并且不太可能是原因。上面的第1点(附加属于当前上下文的实例)很可能是您的问题。
答案 1 :(得分:2)
第二次更新实体时,是否将其附加到同一个DataContext实例?如果你是,那就是抛出异常的原因。您只需要在DataContext的生命周期内附加一次实体。