静态DBContext返回不正确的值

本文关键字:不正确 返回 DBContext 静态 | 更新日期: 2023-09-27 18:25:13

我遇到这样一种情况:具有静态DBContext成员的辅助类正在用与非静态DBContent变量不同的值填充模型的布尔字段。后者正在获取正确的变量。

在这种情况下,我在数据库中有一个指定用户名的用户,其中"isAdmin"设置为true。静态成员返回一个isAdmin=false的User对象,另一个按预期返回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
        }
    }
}

静态DBContext返回不正确的值

您的上下文不应该是静态的。为每个请求创建一个。依赖项注入可以帮助您解决这个问题(这是一个单独的问题/答案)

上下文不是线程安全的,所以在这里甚至不值得尝试找出问题。

之所以会发生这种情况,是因为DBContext缓存了您请求的实体,所以下次您向同一实体询问同一DBContext时,它只会从内存中获取,而不会再次查询数据库。因此,该DBContext之外对该实体的每一次更改都将被忽略。