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

时间:2017-03-18 18:15:35

标签: c# entity-framework

错误:

  

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

我的代码:

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;
}

这种方式我工作,我不知道,因为它不再有效

2 个答案:

答案 0 :(得分:0)

尝试从db或本地上下文获取实体,然后更新它。例如,在你的捕获块中做它。 在这种情况下catch块的示例:

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();
}

答案 1 :(得分:0)

使用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;
    }
}

希望这会有所帮助......