如何调用DbContext Threadsafe

时间:2015-07-28 09:41:53

标签: c# multithreading entity-framework

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

我非常感谢任何关于我需要做出哪些改变的建议或例子。

1 个答案:

答案 0 :(得分:0)

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