2014-05-24 6 views
5

Sto usando EF6 e Identity2 Qui è l'errore che sto ottenendo:Il contesto non può essere utilizzato mentre il modello è in fase di creazione. dbContext viene utilizzato da qualche altra parte?

{ "Il contesto non può essere utilizzato durante la creazione del modello Questa eccezione può essere gettato se il contesto viene utilizzato all'interno della. metodo OnModelCreating o se la stessa istanza contesto si accede da più thread simultaneamente. I membri della DbContext istanza e classi relative non sono garantiti per essere sicuri thread. "}

ho anche guardato questo codice e Coul DNT capire:

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

e qui è il mio codice:

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

}

qui è il mio db inizializzatore:

 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

Che aspetto ha il metodo 'ApplicationDbContext.Create'? –

+0

aggiornamento del codice – user3311522

risposta

2

Non possono farlo. La risposta alla tua domanda è Sì. Nel costruttore del tuo contesto, stai inizializzando il Database. E non è possibile eseguire operazioni CRUD nello stesso tempo, mentre l'inizializzazione del database non è terminata. Dovresti inserire o selezionare, ma Context è usato per Database.SetInitializer. Non ho provato questo, ma controllo potresti farlo con ADO.NET? Se non fosse possibile, controllare: ODBC(Open Database Connectivity)

Problemi correlati