21

Tengo una aplicación web MVC4 que utiliza Entity Framework 5.0 Code First.Cómo inicializar la base de datos con Entity Framework y las tablas de membresía

En Global.asax.cs tengo un bootstrapper que inicializa Entity.Database, fuerza la base de datos a inicializar e inicializa la base de datos para la membresía. El código es la siguiente:

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

la DatabaseContextInitializer es muy simple, por el 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"}) 

    } 
} 

El problema es que no puedo crear usuario a los miembros con:

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

Debido Tengo un problema con que la base de datos no se crea. ¿Cómo se inicializa un usuario predeterminado para su base de datos con Entity Framework 5.0 y Asp.Net MVC 4?

Respuesta

33

Eche un vistazo a following article para conocer el enfoque recomendado para sembrar su base de datos mediante migraciones.

Estos son los pasos:

  1. Crear una nueva aplicación ASP.NET MVC 4 usando la plantilla de internet
  2. En su paquete de tipo consola de administrador de la siguiente comando:

    enable-migrations 
    
  3. Esto creará un archivo ~/Migrations/Configuration.cs en el que puede sembrar su base de datos:

    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. Especificar el memebership y proveedores de papel en su 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. Ejecutar la migración en la consola del gestor de paquetes:

    update-database -verbose 
    
+0

Hola, puedo hacer que esta solución Medio camino. De hecho, tengo que ejecutar la base de datos de actualización dos veces porque la primera vez que se crea la base de datos no son tablas. Tengo el error "No se puede abrir la base de datos" WorkoutPlannerDb "solicitada por el inicio de sesión. El inicio de sesión falló". Supongo que es porque InitializeDatabaseConnection vuelve a abrir una nueva conexión en lugar de usar la primera. –

+2

AutomaticMigrationsEnabled = true; es muy aterrador de usar Migra automáticamente la base de datos cada vez que cambia el primer código DbContext y nunca debe usarse en el entorno de producción. Es extremadamente difícil recuperarse de los cambios bruscos en la base de datos, ya que no tiene pasos de migración desde los que pueda realizar un seguimiento. En su lugar, use "add-migration" para agregar explícitamente los pasos de migración para cada cambio al modelo de DB de primer código. – angularsen

+3

@Darin: Perdón por hacer aparecer una pregunta anterior, pero ¿esto se aplicaría si separas el contexto EF de tu proyecto web? No puedo imaginarme que hicieras referencia a WebMatrix. * Y System.Web.Security como las dependencias creadas que no deberían existir a nivel de datos ... (¿Debería hacer una pregunta para esto?) –

Cuestiones relacionadas