статический DBContext, возвращающий неверные значения - PullRequest
1 голос
/ 20 февраля 2012

У меня есть ситуация, когда вспомогательный класс со статическим членом DBContext заполняет логические поля моделей другими значениями, чем нестатическая переменная DBContext.Последний получает правильные переменные.

В этом случае у меня есть пользователь с указанным именем пользователя в базе данных, где для "isAdmin" установлено значение true.Статический член возвращает объект User с isAdmin = false, другой возвращает его с true, как и ожидалось.См. Ниже.

Кто-нибудь знает, почему это произойдет?

Вот модель:

public class User
{
    [Required]
    public int UserID { get; set; }
    [Required]
    public string username { get; set; }
    [Required]
    public bool isAdmin { get; set; }
}

И проблемный класс помощника выглядит следующим образом:

public static class UserAuthHelper
{
    private static SSBPDContext db = new SSBPDContext();
    public static User getUser(string username, string plaintextPassword)
    {
        var users = db.Users.Where(u => u.username.Equals(username));

        User user = (from u in db.Users
                     where u.username.Equals(username)
                     select u).FirstOrDefault();
        //this user has isAdmin = false
        User otherUser;
        using (var db2 = new SSBPDContext())
        {
            otherUser = (from u in db2.Users
                         where u.username.Equals(username)
                         select u).FirstOrDefault();
            //otherUser has isAdmin = true
        }

    }
}

Ответы [ 2 ]

3 голосов
/ 20 февраля 2012

Ваш контекст не должен быть статичным.Создайте один на запрос.Внедрение зависимостей может помочь вам в этом (это отдельный вопрос / ответ)

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

1 голос
/ 22 февраля 2012

Это происходит потому, что DBContext кэширует запрашиваемые сущности, поэтому в следующий раз, когда вы запрашиваете тот же DBContext для той же сущности, он просто получит его из памяти и не будет запрашивать базу данных снова. Таким образом, каждое изменение этого объекта за пределами этого DBContext будет игнорироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...