C# 如何调用DbContext Threadsafe

C# 如何调用DbContext Threadsafe,c#,multithreading,entity-framework,C#,Multithreading,Entity Framework,我正在使用EF6,目前我偶尔会出错 操作未处理异常:在创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的 我已经阅读了关于这个话题的一些有用的答案,并且我理解了什么是错误的基本概念,但是我不确定如何做出改变来解决这个问题 我使用了一个所有其他控制器都继承的基本控制器类,下面包含了相关代码。我使用两个上下文,一个用于我的应用程序数据数据模型,一个用于

我正在使用EF6,目前我偶尔会出错

操作未处理异常:在创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的

我已经阅读了关于这个话题的一些有用的答案,并且我理解了什么是错误的基本概念,但是我不确定如何做出改变来解决这个问题

我使用了一个所有其他控制器都继承的基本控制器类,下面包含了相关代码。我使用两个上下文,一个用于我的应用程序数据<代码>数据模型,一个用于ASP NET Identity 2.0表<代码>应用程序上下文。我认为每一个新的请求都会实例化一个新的基本控制器,从而产生新的上下文

public class BaseController : Controller
{
    protected DataModel db = new DataModel();

    /// <summary>
    /// Application DB context
    /// </summary>
    protected ApplicationDbContext ApplicationDbContext { get; set; }

    /// <summary>
    /// User manager - attached to application DB context
    /// </summary>
    protected UserManager<ApplicationUser> UserManager { get; set; }

    public BaseController()
    {
        this.ApplicationDbContext = new ApplicationDbContext();
        this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
        // We need to allow the user name to also be the email address
        UserManager.UserValidator = new UserValidator<ApplicationUser>(UserManager) { AllowOnlyAlphanumericUserNames = false };

        // Setup a token for Password Resets
        var provider = Startup.DataProtectionProvider;
        UserManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("UserToken"));
    }
}
公共类BaseController:控制器
{
受保护的DataModel db=新DataModel();
/// 
///应用程序数据库上下文
/// 
受保护的ApplicationDbContext ApplicationDbContext{get;set;}
/// 
///用户管理器-附加到应用程序数据库上下文
/// 
受保护的用户管理器用户管理器{get;set;}
公共BaseController()
{
this.ApplicationDbContext=新的ApplicationDbContext();
this.UserManager=newusermanager(newuserstore(this.ApplicationDbContext));
//我们需要允许用户名也是电子邮件地址
UserManager.UserValidator=newuservalidator(UserManager){AllowOnlyAlphanumericUserNames=false};
//为密码重置设置令牌
var provider=Startup.DataProtectionProvider;
UserManager.UserTokenProvider=新的DataProtectorTokenProvider(provider.Create(“UserToken”);
}
}

任何关于我需要进行哪些更改的建议或示例都将不胜感激。

自定义属性/过滤器可能会导致并发问题。您的派生控制器中有任何控制器吗?

通常,我们在多线程场景中使用
lock
。我认为您的问题在于创建
UserStore
上下文,请参见以下内容。您可以对上下文使用
Lazy
初始化,然后再次使用相同的上下文。否,它们都只在
BaseController
上。它们在底座上时也会引起问题。是否访问数据库上下文?否,基本上没有任何属性访问数据库上下文:/