我遇到一种情况,其中带有静态DBContext成员的辅助类使用与非静态DBContext变量不同的值填充模型的布尔字段。后者正在获得正确的变量。
在这种情况下,我在数据库中有一个具有指定用户名的用户,其中“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
}
}
}
答案 0 :(得分:3)
您的上下文不应该是静态的。每个请求创建一个。依赖注入可以帮助您(这是一个单独的问题/答案)
上下文不是线程安全的,因此在这里找不到问题甚至不值得。
答案 1 :(得分:1)
这是因为DBContext缓存了您请求的实体,因此下次您向相同的实体请求相同的DBContext时,它将从内存中获取它,而不是再次查询数据库。因此,将忽略对该DBContext之外的该实体的每次更改。