为了账号安全,请及时绑定邮箱和手机立即绑定

尽管使用 SaveChanges(),但无法更改 EF 中的值

尽管使用 SaveChanges(),但无法更改 EF 中的值

C#
慕姐4208626 2021-07-20 17:00:41
我在更新实体框架 6 中的值时遇到问题,我已经通过互联网彻底查看了答案,但似乎我做的一切都很好,但我似乎无法让它工作。值得一提的是,将实体添加到数据库中效果很好,这意味着我可以将项目中的产品/用户添加到数据库中,但不能更新它们。这是家庭作业。 public bool ChangeAccountStatus(long userID, bool isUserActive)    {        User userToChange = GetUserById(userID); // Gets the user whose values I want to change.        using (var context = new ShopContext())        {            if (userToChange != null)            {                if (isUserActive)                {                    userToChange.IsActive = false;                    context.SaveChanges();                }                else                {                    userToChange.IsActive = true;                    context.SaveChanges();                }                return true;            }            return false;        }    }如果我使用 linq 来查找我想要更改其值的用户,我可以使更新工作,但我不希望我的项目中有太多的代码重复,并且我在许多中使用相同的 linq(函数 GetUserById)其他功能。我是否需要使用 linq 从数据库访问用户,而不是使用我创建的函数来避免代码重复?这是 GetUserById 函数:        public User GetUserById(long userId)     {        using (var context = new ShopContext())        {            var userToFind = context.UsersTable                .Where((u) => u.Id == userId).FirstOrDefault();            if (userToFind != null)                return userToFind;            else                return null;        }    }
查看完整描述

1 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您正在从一个上下文中检索实体,然后调用SaveChanges()不同的上下文。如果您内联该方法,它将变得更加清晰:


var userToChange;

using (var context = new ShopContext())

{

    userToChange = context.UsersTable.Where((u) => u.Id == userId).FirstOrDefault();

}


using (var context = new ShopContext())

{

    if (userToChange != null)

    {

        if (isUserActive)

        {

            userToChange.IsActive = false;

            context.SaveChanges();

        }

        else

        {

            userToChange.IsActive = true;

            context.SaveChanges();

        }

        return true;

    }

    return false;

}

第二个上下文对 userToChange 一无所知,因为它没有跟踪它。你可以告诉它:


context.UsersTable.Attach(userToChange);

顺便说一句,那里有一些冗余代码 - 一个 if 语句,可以简化为 true 或 false 分配布尔值:


if (isUserActive)

    userToChange.IsActive = false;

else

    userToChange.IsActive = true;


// Equivalent to:

userToChange.IsActive = !isUserActive;

并且不需要空检查:


if (userToFind != null)

    return userToFind;

else

    return null;


// Equivalent to:

return userToFind;


查看完整回答
反对 回复 2021-07-31
  • 1 回答
  • 0 关注
  • 390 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信