2014-05-24 15 views
5

Ich bin mit EF6 und Identity2 Hier ist der Fehler Ich erhalte:Der Kontext kann nicht verwendet werden, während das Modell erstellt wird. dbContext wird woanders verwendet?

{ "Der Kontext kann nicht verwendet werden, während das Modell erstellt wird diese Ausnahme ausgelöst werden, wenn der Kontext innerhalb der verwendet wird. OnModelCreating Methode oder wenn die gleiche Kontextinstanz durch mehrere Threads gleichzeitig zugegriffen wird. Man beachte, dass beispielsweise Mitglieder der DbContext und verwandte Klassen sind nicht auf die Threadsicherheit gewährleistet. "}

I auch bei diesem Code gesucht und coul dnt herauszufinden:

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

und hier ist mein 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(); 
    } 
} 

}

hier ist meine db initializer:

 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; } 
} 
+0

Wie sieht die 'ApplicationDbContext.Create' Methode aus? –

+0

Aktualisierung des Codes – user3311522

Antwort

2

Sie können es nicht tun. Antwort Ihrer Frage ist Ja. Im Konstruktor Ihres Kontexts initialisieren Sie Database. Und Sie können keine CRUD-Operationen gleichzeitig ausführen, während die Initialisierung der Datenbank nicht abgeschlossen ist. Sie würden einfügen oder auswählen, aber Context wird für Database.SetInitializer verwendet. Ich habe das nicht versucht, aber könnten Sie es mit ADO.NET tun? Wenn Sie nicht konnten, überprüfen Sie dies: ODBC(Open Database Connectivity)

Verwandte Themen