猿问

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

我在更新实体框架 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;

        }

    }


慕姐4208626
浏览 391回答 1
1回答

杨__羊羊

您正在从一个上下文中检索实体,然后调用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;
随时随地看视频慕课网APP
我要回答