C# 静态DBContext返回不正确的值

C# 静态DBContext返回不正确的值,c#,asp.net-mvc-3,entity-framework-4,C#,Asp.net Mvc 3,Entity Framework 4,我遇到过这样一种情况:带有静态DBContext成员的helper类使用与非静态DBContext变量不同的值填充模型的布尔字段。后者得到了正确的变量 在本例中,我在数据库中有一个具有指定用户名的用户,其中“isAdmin”设置为true。静态成员返回一个isAdmin=false的用户对象,另一个成员按预期返回true。见下文 有人知道为什么会这样吗 模型如下: public class User { [Required] public int UserID { get; se

我遇到过这样一种情况:带有静态DBContext成员的helper类使用与非静态DBContext变量不同的值填充模型的布尔字段。后者得到了正确的变量

在本例中,我在数据库中有一个具有指定用户名的用户,其中“isAdmin”设置为true。静态成员返回一个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
        }

    }
}

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


上下文不是线程安全的,因此不值得在此尝试解决问题。

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

请不要在标题前面加上“C#MVC3-”之类的前缀。这就是标签的作用。哦,对不起。谢谢你修复它。线程安全在这里不应该是个问题。我用用户数据库中的一行在本地运行它,静态上下文每次都错误地填充布尔字段。很高兴知道它不是线程安全的,我不会再像这样使用它了,但我希望能够深入了解为什么会发生这种情况。在没有看到任何其他内容的情况下,这里很难说,而且可能会遗漏一些细节,例如,他们都在寻找同一个数据库吗?你确定?一种解释是,一个上下文没有连接字符串(或者找不到不正确的连接字符串),并且正在使用初始化的数据创建数据库。你可能会在这里对我大喊大叫,说‘我不可能不初始化任何数据’,我会说这很公平,但我无法从发布的细节中判断。你用的是什么数据库引擎?加载sql概要文件以检查正在进行的查询,或者使用EFProf试用版来分析上下文/查询以提供洞察。它们是相同的上下文,并且我相当确定它命中了正确的数据库-所有其他字段(为简洁起见,此处未提及)都正确填充。我现在正在使用SQLCompact(构建我的第一个MVC应用程序)。谢谢SQL分析器提示,我会研究一下。如果你想给我发送一个示例应用程序,我会帮你检查一下。我是第一个。最后一个在gmail.comHuh。根据DBContext,如果它是
公共静态对象,则它是线程安全的。文档是否有误?