如何调用DbContext线程安全

本文关键字:DbContext 线程 安全 调用 何调用 | 更新日期: 2023-09-27 18:05:09

我正在使用EF6,目前我偶尔得到一个错误;

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

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

我使用了一个所有其他控制器都继承的基控制器类,我在下面包含了相关的代码。我使用两个上下文,一个用于我的应用程序数据;DataModel和一个用于asp.net Identity 2.0表;ApplicationDbContext。我认为,每个新的请求将实例化一个新的基本控制器,因此新的上下文?

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"));
    }
}

任何关于我需要做什么改变的建议或例子将不胜感激。

如何调用DbContext线程安全

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