C# 无法使用实体框架修改实体

C# 无法使用实体框架修改实体,c#,.net,asp.net-mvc,entity-framework,asp.net-web-api,C#,.net,Asp.net Mvc,Entity Framework,Asp.net Web Api,我在Web Api应用程序中使用了实体框架,如下所示: [HttpPut] public System.Web.Mvc.JsonResult UpdateAccount(CollaborateurModel item) { if (ModelState.IsValid) { ApplicationUser user = UserManager.FindByIdAsync(item.id_user_fk).Result;

我在Web Api应用程序中使用了实体框架,如下所示:

 [HttpPut]
    public System.Web.Mvc.JsonResult UpdateAccount(CollaborateurModel item)
    {
        if (ModelState.IsValid)
        {
            ApplicationUser user = UserManager.FindByIdAsync(item.id_user_fk).Result;
            user.Roles.Clear();
            UserManager.AddToRoleAsync(item.id_user_fk, item.Role);
            ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);
            repo.UpdateCollaborateur(entity);
            return new System.Web.Mvc.JsonResult { Data = true };
        }
        else
        {
            return new System.Web.Mvc.JsonResult { Data = false };
        }
    }
Update
方法中引发异常

未能附加实体类型“sport.DAL.Entities.ajt_collaborator”,因为相同类型的另一实体已具有此主键值。当您使用“附加”方法或将“未更改”值或“修改”设置为图元的状态时,可能会发生这种情况,无论图元是否具有图形特征键值​​在冲突中。有些实体可能是新的,可能没有收到任何键值​​由数据库生成。在这种情况下,使用“添加”方法或“添加”实体绘制图形,并将值“未更改”或“修改”分配给除新实体以外的状态实体

我需要知道

  • 这一例外的原因是什么
  • 我怎样才能修好它
  • EF认为上下文和数据库不同步,因为您正在将项目标记为已修改,但它没有为主键设置值

  • 处理此问题的典型模式是检查PK字段并相应地设置实体状态:

  • context.Entry(item.State=(item.PK==默认值(int))?添加System.Data.Entity.EntityState.Add:System.Data.Entity.EntityState.Modified

    (其中默认值(int)是PK的数据类型)


    在您的情况下,最有可能的解决方法是确保PK/key字段甚至被发送到该方法,以便在自动映射时不会丢失该字段,或者在调用更新方法之前从数据库中重新蚀刻该项。

    也可能是您的
    项收到时没有主键,或者映射后主键可能丢失。

    不要填充ajt\U协作者实体,如下所示-

    ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);
    
    ajt\u合作者实体=Mapper.Map(项目);
    

    相反,使用
    Find
    (或
    Where
    等)填充
    ajt\u协作者实体
    ,这样就不会有新对象,但我们可以获得实体中已经存在的现有对象),然后使用
    Automapper
    将所有属性从
    映射到
    实体
    。最后使用映射实体进行更新。

    而不是
    Mapper.Map(项)
    你能在实体上执行
    查找
    ,然后使用该对象进行更新吗?@Ramilu你的意思是找到实体,然后用CollabourModel的属性填充它,而不是使用Automapper转换它吗?这会如何改变结果?我想
    Mapper.Map
    会给你一个新对象,然后你会将
    Modified
    设置到这个新对象。但是已经存在具有相同
    id
    的对象。这就是为什么你会犯这样的错误。所以做一个
    find
    ,为
    Mapper使用该对象。Map
    collabourmodel
    属性映射到对象,然后使用它进行更新。
    ajt\u collaborator entity
    应该由
    find
    where
    填充,然后将所有属性从
    映射到
    实体
    。然后将该实体用于updateGlad,我可以解决您的问题。发布与解决方案相同。
    collabourmodel
    id属性是否与
    ajt\u collaborator
    id同名?可能您的自动映射器配置不正确。它的名称相同,我检查主键是否传递给BLL方法,然后它是否传递给DAL方法。如果您做的一切都正确,您可以尝试使用或在设置
    state
    attach
    context.attach(项)之前包装它
    context.Attach(item)
    在EF6中给我一个错误。我必须在前面提到实体类,例如
    context.Blogs.Attach(existingBlog)。在我的示例中,我如何做到这一点?
    
    public bool Update(params T[] items)
            {
                if (context == null) context = GetContext();
                try
                {
                    foreach (T item in items)
                    {
                        context.Entry(item).State = System.Data.Entity.EntityState.Modified;
                    }
                    context.SaveChanges();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    
    ajt_collaborator entity = Mapper.Map<CollaborateurModel, ajt_collaborator>(item);