在创建模型时不能使用上下文。 dbContext正在其他地方使用?

时间:2022-12-22 21:03:54

I am using EF6 and Identity2 Here is the error I am getting:

我正在使用EF6和Identity2这是我得到的错误:

{"The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe."}

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

I also looked at this code and couldnt figure out:

我也查看了这段代码并且无法弄清楚:

"Context cannot be used while the model is being created" exception with ASP.NET Identity

“使用ASP.NET标识创建模型时不能使用上下文”

and here is my code:

这是我的代码:

Startup.Auth.cs:

namespace IdentitySample {
public partial class Startup {
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app) {
        // Configure the db context, user manager and role manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        // Configure the sign in cookie
        app.UseCookieAuthentication(new CookieAuthenticationOptions {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/account/login"),
            Provider = new CookieAuthenticationProvider {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process.
        app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));

        // Enables the application to remember the second login verification factor such as phone or email.
        // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from.
        // This is similar to the RememberMe option when you log in.
        app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //   consumerKey: "",
        //   consumerSecret: "");

        //app.UseFacebookAuthentication(
        //   appId: "",
        //   appSecret: "");

        app.UseGoogleAuthentication();
    }
}

}

here is my db initializer:

这是我的db初始化器:

        public override void InitializeDatabase(ApplicationDbContext context)
    {
        if (!context.Database.Exists())
        {
            // If database did not exist before, create it
            context.Database.Create();
        }
        else
        {
            // Query to check if MigrationHistory table is present in the database 
            var migrationHistoryTableExists = 
                ((IObjectContextAdapter)context).ObjectContext.ExecuteStoreQuery<int>(
            string.Format(
              "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' " 
                + "AND table_name = '__MigrationHistory'",
              "[worldbigtree.security]"));

            // If MigrationHistory table is not there (which is the case first time we run), create it
            if (migrationHistoryTableExists.FirstOrDefault() == 0)
            {
                if (settings.RecreateDatabase)
                {
                    context.Database.Delete();
                    context.Database.Create();
                    InitializeIdentityForEF(context);
                }
            }
        }


        base.Seed(context);
    }

applicationDbContext:

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        Database.SetInitializer<ApplicationDbContext>(new MySqlInitializer());
    }

    static ApplicationDbContext()
    {
        // Set the database intializer which is run once during application start
        // This seeds the database with admin user credentials and admin role
        Database.SetInitializer<ApplicationDbContext>(new MySqlInitializer());
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    public DbSet<Person> People { get; set; }
}

1 个解决方案

#1


2  

You can not do it. Answer of your question is Yes. In constructor of your context, you're initializing Database. And you can not do any CRUD operations in same time, while Initializing the Database is not finished. You would insert or select, but Context is used for Database.SetInitializer. I have not tried this, but check could you do it with ADO.NET? If you couldn't, check this: ODBC(Open Database Connectivity)

你做不了。你的问题的答案是肯定的。在上下文的构造函数中,您正在初始化Database。并且您无法同时执行任何CRUD操作,而初始化数据库尚未完成。您可以插入或选择,但Context用于Database.SetInitializer。我没有试过这个,但是你可以用ADO.NET来检查吗?如果你不能,请检查:ODBC(开放数据库连接)

#1


2  

You can not do it. Answer of your question is Yes. In constructor of your context, you're initializing Database. And you can not do any CRUD operations in same time, while Initializing the Database is not finished. You would insert or select, but Context is used for Database.SetInitializer. I have not tried this, but check could you do it with ADO.NET? If you couldn't, check this: ODBC(Open Database Connectivity)

你做不了。你的问题的答案是肯定的。在上下文的构造函数中,您正在初始化Database。并且您无法同时执行任何CRUD操作,而初始化数据库尚未完成。您可以插入或选择,但Context用于Database.SetInitializer。我没有试过这个,但是你可以用ADO.NET来检查吗?如果你不能,请检查:ODBC(开放数据库连接)