C# 失败,因为相同类型的另一个实体已具有相同的主键值
错误: 其他信息:附加“Entities.Customer”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,并且没有收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 我的代码:C# 失败,因为相同类型的另一个实体已具有相同的主键值,c#,entity-framework,C#,Entity Framework,错误: 其他信息:附加“Entities.Customer”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,并且没有收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 我的代码: public bool Update(TEntit
public bool Update(TEntity entity)
{
bool result = false;
try
{
EntitySet.Attach(entity);
Context.Entry<TEntity>(entity).State = EntityState.Modified;
Context.SaveChanges();
result = true;
}
catch (Exception)
{
throw;
}
return result;
}
public bool更新(TEntity实体)
{
布尔结果=假;
尝试
{
EntitySet.Attach(实体);
Context.Entry(entity.State=EntityState.Modified;
SaveChanges();
结果=真;
}
捕获(例外)
{
投掷;
}
返回结果;
}
通过这种方式工作,我不知道,因为它不再工作了尝试从db或本地上下文获取实体,然后更新它。例如,在你的接球区做。 这种情况下的捕捉块示例:
catch
{
// get entity here
// for example Context.Set<TEntity().Local.FirstOrDefault(selector);
//or .Find() instead of .FirstOrDefault()
Context.Entry(entity).State = EntityState.Modified;
Context.SaveChanges();
}
catch
{
//在这里获取实体
//例如Context.Set使用block尝试这种方法:
try
{
/* For avoiding "Attaching an entity of type 'Xxxxx' failed because another entity of
the same type already has the same primary key value." error use this method like this */
using (var context = new Context.Entry<TEntity>())
{
context.Entry(entity).State = EntityState.Modified; // modified
context.SaveChanges(); //Must be in using block
result = true;
}
}
试试看
{
/*用于避免“由于另一个实体的
同一类型已具有相同的主键值。“错误请像这样使用此方法。”*/
使用(var context=new context.Entry())
{
context.Entry(entity.State=EntityState.Modified;//已修改
context.SaveChanges();//必须在using块中
结果=真;
}
}
希望这有助于…您显示代码的一小部分。不清楚EntitySet
在哪里初始化,或者它的生命周期是什么。此错误通常表示上下文的生命周期太长。如果您确实想要答案,您必须付出更多努力,对注释和答案提供有意义的反馈。