尽管使用了SaveChanges()

时间:2018-06-07 23:37:02

标签: c# entity-framework

我无法更新实体框架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 个答案:

答案 0 :(得分:4)

您正在从一个上下文中检索实体,然后在不同的上下文中调用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;