C# 如何调用DbContext Threadsafe
我正在使用EF6,目前我偶尔会出错 操作未处理异常:在创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的 我已经阅读了关于这个话题的一些有用的答案,并且我理解了什么是错误的基本概念,但是我不确定如何做出改变来解决这个问题 我使用了一个所有其他控制器都继承的基本控制器类,下面包含了相关代码。我使用两个上下文,一个用于我的应用程序数据<代码>数据模型,一个用于ASP NET Identity 2.0表<代码>应用程序上下文。我认为每一个新的请求都会实例化一个新的基本控制器,从而产生新的上下文C# 如何调用DbContext Threadsafe,c#,multithreading,entity-framework,C#,Multithreading,Entity Framework,我正在使用EF6,目前我偶尔会出错 操作未处理异常:在创建模型时无法使用上下文。如果上下文在OnModelCreating方法内使用,或者如果多个线程同时访问同一上下文实例,则可能引发此异常。注意,DbContext和相关类的实例成员不能保证是线程安全的 我已经阅读了关于这个话题的一些有用的答案,并且我理解了什么是错误的基本概念,但是我不确定如何做出改变来解决这个问题 我使用了一个所有其他控制器都继承的基本控制器类,下面包含了相关代码。我使用两个上下文,一个用于我的应用程序数据数据模型,一个用于
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
上。它们在底座上时也会引起问题。是否访问数据库上下文?否,基本上没有任何属性访问数据库上下文:/