Невозможно изменить значения в EF, несмотря на использование SaveChanges () - PullRequest
0 голосов
/ 08 июня 2018

У меня проблемы с обновлением значений в 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 голосов
/ 08 июня 2018

Вы извлекаете сущность из одного контекста, затем вызываете 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...