【问题标题】:Entity framework, can't update entity实体框架,无法更新实体
【发布时间】:2015-09-19 17:37:22
【问题描述】:

我正在尝试更新实体,但实体框架不保存更改

这是我的代码

public bool updateUser(user CUser)
{
            CurrentUser = (CustomPrincipal)HttpContext.Current.User;
            user userToBeUpdated = context.users.Where(user => user.user_id == CurrentUser.Id).FirstOrDefault();

            userToBeUpdated  = CUser;

            context.SaveChanges();
            return true;
}

我的代码有什么问题吗?

更新

public bool updateUser(user CUser)
{
    CurrentUser = (CustomPrincipal)HttpContext.Current.User;
    user userToBeUpdated = context.users.Where(user => user.user_id == CurrentUser.Id).FirstOrDefault();
    CUser.user_id = userToBeUpdated.user_id;
    CUser.date_created = userToBeUpdated.date_created;

    if (CUser.Password == "hidden")
        CUser.Password = userToBeUpdated.Password;
    else
        CUser.Password = new Hash().GetBcryptHashedPassword(CUser.Password);

    if (CUser.UDTO.File.ContentLength > 0)
    {
        FileHelper ProfilePicture = new FileHelper(CUser.UDTO.File, "jpg,jpeg,png", 5, true, 500, 500);
        if (!checkUserPersonalImage(CUser.UDTO.File, CUser, ProfilePicture, CurrentUser))
        {
            return false;
        }
        CUser.PersonalImage = ProfilePicture.uploadFile();
    }
    else
    {
        CUser.PersonalImage = userToBeUpdated.PersonalImage;
    }   

    if (!checkRoleValidity(CUser, CurrentUser, false, false))
    {
        return false;
    }
    if (!checkDepartmentValidity(CUser, CurrentUser, false, false))
    {
        return false;
    }
    userToBeUpdated = CUser;
    context.Entry(userToBeUpdated).State = System.Data.Entity.EntityState.Modified;
    context.SaveChanges();
    new UserHelperMethods().updateUserHolderLists(CurrentUser.Company, CUser);
    CUser.UDTO.RedirectTo = "AddNewUser";
    CUser.UDTO.Message="<div class='success'>User has been updated successfully</div>";
    CUser.UDTO.Company = CurrentUser.Company;
    return true;
}

这是完整的功能,我收到以下错误

附加类型为“workflow.Models.user”的实体失败,因为 另一个相同类型的实体已经具有相同的主键 价值。使用“附加”方法或设置 如果实体中有任何实体,则实体的状态为“未更改”或“已修改” 图有冲突的键值。这可能是因为某些实体 是新的,尚未收到数据库生成的键值。在 这种情况下使用 'Add' 方法或 'Added' 实体状态来跟踪 图表,然后将非新实体的状态设置为“未更改”或 酌情“修改”。

【问题讨论】:

  • 谢谢。您的函数不返回任何内容。你可能跳过了一些重要的事情。有没有抛出异常?
  • 我刚刚注意到....除了从数据库中获取数据之外,您的函数几乎什么都不做...
  • @DevilSuichiro 没有例外
  • userToBeUpdated = CUser; 并没有按照你的想法去做。
  • @Claies 我曾经通过更改其值来更新实体中的字段,然后调用`context.SaveChanges()` 例如userToBeUpdated.X = 15; context.SaveChanges(); 然后它保存更改所以我认为@ 987654325@changes 和userToBeUpdated .X = 15; 一样工作

标签: asp.net-mvc entity-framework


【解决方案1】:

我曾经通过更改其值来更新实体中的字段,然后调用context.SaveChanges() 例如 userToBeUpdated.X = 15; context.SaveChanges();然后它保存更改,所以我认为 userToBeUpdated = CUser 更改的工作方式与 userToBeUpdated .X = 15 相同

你认为userToBeUpdated.X=15userTobeUpdated=CUser 做同样的事情是完全错误的。 userToBeUpdated 变量引用的原始对象仍由 EF 跟踪。之后您将 userToBeUpdated 变量的引用更改 到另一个对象的实例并将其附加到 DbContext。 dbcontext 现在尝试跟踪两个对象:它从数据库中检索的用户和具有相同主键的第二个对象。 EF 对此犹豫不决并抛出异常。

所以.X=15 方法是正确的。您应该从 CUser 更新 userToBeUpated 上的所有相关属性,然后保存更改。

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多