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

jav*_*ati 10 c# asp.net-mvc entity-framework

错误信息 :

附加"FaridCRMData.Models.Customer"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.Attach()如果图中的任何实体具有冲突的>键值,则在使用该方法或将实体的状态设置为"未更改"或"已修改" 时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".

我的代码:

public class FactorController : Controller
{
    public JsonResult SaveFactor(Factor factor,int id)
    {
        if (id > 0)
        {
            bool result = new FactorService.BaseService.Update(factor);
            return new JsonResult() { Data = result };
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

FactorService.BaseService.cs:

public bool Update(TEntity entity)
{
    var entry = context.Entry(entity);
    if (entry.State == EntityState.Detached || entry.State == EntityState.Modified)
    {

        context.Set<TEntity>().Attach(entity);// Error Is Here
        entry.State = EntityState.Modified;
        context.SaveChanges();
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

Nit*_*are 12

我相信您可能在更新之前调用了Select。默认情况下,DBContext将在记录被选中(选中)时缓存记录,在获取记录时在select调用中使用“ AsNoTracking()”。


fed*_*zzi 5

您是否曾尝试将您的实体标记为已修改,然后将其附加到上下文?

像这样:

public bool Update(TEntity entity)
{
    var entry = context.Entry(entity);
    if (entry.State == EntityState.Detached || entry.State == EntityState.Modified)
    {
        entry.State = EntityState.Modified; //do it here

        context.Set<TEntity>().Attach(entity); //attach

        context.SaveChanges(); //save it
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)