C# 失败,因为相同类型的另一个实体已具有相同的主键值

C# 失败,因为相同类型的另一个实体已具有相同的主键值,c#,entity-framework,C#,Entity Framework,错误: 其他信息:附加“Entities.Customer”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,并且没有收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改” 我的代码: public bool Update(TEntit

错误:

其他信息:附加“Entities.Customer”类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。如果图形中的任何实体具有冲突的键值,则在使用“Attach”方法或将实体状态设置为“Unchanged”或“Modified”时可能会发生这种情况。这可能是因为某些实体是新的,并且没有收到数据库生成的键值。在这种情况下,使用“添加”方法或“添加”实体跟踪图形,然后根据需要将非新实体的状态设置为“未更改”或“已修改”

我的代码:

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
在哪里初始化,或者它的生命周期是什么。此错误通常表示上下文的生命周期太长。如果您确实想要答案,您必须付出更多努力,对注释和答案提供有意义的反馈。