Обновление модели EF force после выхода из системы - PullRequest
1 голос
/ 14 февраля 2012

У меня проблема с моей моделью в модели EF.У меня есть веб-приложение со слоем безопасности и уровнем сущности и слоем mvc3.Таким образом, в каждом слое я помещаю экземпляр моего контекста db (по одному для каждого класса в разделе основного объявления).проблема в том, что когда вы находите любого пользователя из моей базы данных для проверки процесса входа в систему, простой поиск, а не внесение каких-либо изменений в сущность, выглядит следующим образом:

var usr = db.Usuarios.First(user => user.UserName.Equals(userName));

Если я изменю пароль, например, в другом слое(в моем контроллере) и снова выйдите из системы, поиск linq (см. код вверх) всегда возвращает старый пароль.Это для контекста, который db не утилизирует и не идет в базу данных для данных, просто загрузите пользователя для модели.

Итак, как я могу заставить модель обновить данные из базы данных?Я пытаюсь, положить ленивый груз в ложь, но не работает.

db.Configuration.LazyLoadingEnabled = false;

частичная работа, если я декальцирую экземпляр моего контекста в методе для проверки правильности выполнения и утилизации этого экземпляра, но я думаю, что это лучшая практика.

вот так:

    public static bool ValidateUser(string userName, string password)
    {
        if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
        {
            var dbtmp = new ConorContainer();

            var usr = dbtmp.Usuarios.First(user => user.UserName.Equals(userName));
            if (usr != null)
            {
                var passDescrypt = Decript(usr.Password);
                dbtmp.Dispose();
                return passDescrypt.Equals(password);
            }
            return false;
        }
        return false;
    }

1 Ответ

0 голосов
/ 14 февраля 2012

Вы должны решить время жизни контекста в каждом случае.Предпочтительно использовать кратковременные контексты в веб-приложениях , особенно в статических методах .

Ваш метод может быть улучшен путем использования блока using, который будет вызывать метод Dispose при переходевне области видимости.

public static bool ValidateUser(string userName, string password)
{
    if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
    {
        using(var dbtmp = new ConorContainer())
        {

            var usr = dbtmp.Usuarios.First(user => user.UserName.Equals(userName));
            if (usr != null)
            {
                 var passDescrypt = Decript(usr.Password);
                 return passDescrypt.Equals(password);
            }
        }

        return false;
    }

    return false;
}
...