21

Ho un'applicazione Web MVC4 che utilizza il codice Entity Framework 5.0 First.Come inizializzare il database con le tabelle Entity Framework e Membership

In Global.asax.cs Ho un bootstrap che inizializza Entity.Database, impone l'inizializzazione del database e inizializza il database per l'appartenenza. Il codice è questo:

System.Data.Entity.Database.SetInitializer(new DatabaseContextInitializer()); 
Database.Initialize(true); 
WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Il DatabaseContextInitializer è molto semplice, per il momento:

public class DatabaseContextInitializer : DropCreateDatabaseIfModelChanges<DatabaseContext> 
{ 
    protected override void Seed(DatabaseContext dbContext) 
    { 
     base.Seed(dbContext); 
     db.Set<Workout>().Add(new Workout {Id = 1, Name = "My First workout user1"}) 

    } 
} 

Il problema è che non riesco a creare per l'utente per l'adesione con:

WebSecurity.InitializeDatabaseConnection(DEFAULTCONNECTION, "UserProfile", "UserId", "UserName", autoCreateTables: true); 

Perché Ho un problema con il fatto che il database non è stato creato. Come si inizializza un utente predefinito per il proprio database con Entity Framework 5.0 e Asp.Net MVC 4?

risposta

33

Dai uno sguardo allo following article per l'approccio consigliato per il seeding del database utilizzando le migrazioni.

Ecco i passaggi:

  1. creare una nuova applicazione ASP.NET MVC 4 utilizzando il modello Internet
  2. Nel pacchetto tipo di console direttore il seguente comando:

    enable-migrations 
    
  3. Ciò creerà un file ~/Migrations/Configuration.cs in cui è possibile eseguire il seeding del database:

    using System.Data.Entity.Migrations; 
    using System.Linq; 
    using System.Web.Security; 
    using WebMatrix.WebData; 
    
    internal sealed class Configuration : DbMigrationsConfiguration<MvcApplication1.Models.UsersContext> 
    { 
        public Configuration() 
        { 
         AutomaticMigrationsEnabled = true; 
        } 
    
        protected override void Seed(MvcApplication1.Models.UsersContext context) 
        { 
         WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
    
         if (!Roles.RoleExists("Administrator")) 
         { 
          Roles.CreateRole("Administrator"); 
         } 
    
         if (!WebSecurity.UserExists("john")) 
         { 
          WebSecurity.CreateUserAndAccount("john", "secret"); 
         } 
    
         if (!Roles.GetRolesForUser("john").Contains("Administrator")) 
         { 
          Roles.AddUsersToRoles(new[] { "john" }, new[] { "Administrator" }); 
         } 
        } 
    } 
    
  4. Specificare il memebership e provider di ruoli nel web.config:

    <roleManager enabled="true" defaultProvider="SimpleRoleProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/> 
        </providers> 
    </roleManager> 
    <membership defaultProvider="SimpleMembershipProvider"> 
        <providers> 
        <clear/> 
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" /> 
        </providers> 
    </membership> 
    
  5. Esegui la migrazione nella console gestore di pacchetti:

    update-database -verbose 
    
+0

Ciao, posso fare questa soluzione a metà strada. Devo infatti eseguire due volte update-database perché la prima volta viene creato il database ma non le tabelle. Ho l'errore "Impossibile aprire il database" WorkoutPlannerDb "richiesto dal login. L'accesso non è riuscito." Immagino sia perché InitializeDatabaseConnection riapre una nuova connessione invece di usare la prima? –

+2

AutomaticMigrationsEnabled = true; è molto spaventoso da usare. Migra automaticamente il database ogni volta che si modifica il codice DbContext e non deve mai essere utilizzato nell'ambiente di produzione. È estremamente difficile recuperare da modifiche inaspettate in DB, dal momento che non ci sono passaggi di migrazione da cui risalire. Utilizzare invece "aggiungi-migrazione" per aggiungere esplicitamente passaggi di migrazione per ogni modifica al modello di DB code-first. – angularsen

+3

@Darin: Mi spiace richiamare una domanda precedente, ma ciò vale anche se si separa il contesto EF dal proprio progetto web? Non riesco a immaginare che tu possa fare riferimento a WebMatrix. * E System.Web.Security poiché crea dipendenze che non dovrebbero esistere a livello di dati ... (Forse dovrei fare una domanda per questo?) –

Problemi correlati