静态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之外对该实体的每一次更改都将被忽略。