如何使调用DbContext线程安全

4
我正在使用EF6,但偶尔会遇到错误;
引用: “操作未处理异常:在创建模型时无法使用上下文。如果在OnModelCreating方法内部使用上下文或多个线程同时访问同一上下文实例,则可能抛出此异常。请注意,DbContext及其相关类的实例成员不能保证是线程安全的。”
我已经阅读了一些有用的答案herehere,并且我理解基本概念,但我不确定如何进行更改以解决此问题。
我使用一个所有其他控制器都继承的基础控制器类,下面包含了相关代码。我使用两个上下文,一个用于我的应用程序数据; 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"));
    }
}

非常感谢您的反馈,如果您能提供一些关于需要做出哪些改变的建议或示例,我们将不胜感激。

通常在多线程场景下,我们使用 lock - Amit Kumar Ghosh
我认为你的问题在于创建UserStore上下文,参见以下链接:https://dev59.com/X2Ei5IYBdhLWcg3wX7XP - 3dd
您可以使用Lazy<T>初始化您的上下文,并再次使用相同的上下文。 - VMAtm
1个回答

0

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


不,它们都在 BaseController 上。 - Josh
当它们在基础上时,它们也可能会引起问题。你在那里访问数据库上下文吗? - LueTm
不,基类上的任何属性都没有访问数据库上下文:/ - Josh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接