Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
de Maurycy Markowski, Sara Soares de Almeida, Robert McMurray
En este tutorial se muestra cómo reemplazar el mecanismo de almacenamiento de datos predeterminado para ASP.NET Identity por EntityFramework (proveedor de cliente SQL) por un proveedor mySQL.
En este tutorial se tratarán los temas siguientes:
- Creación de una base de datos MySQL en Azure
- Creación de una aplicación MVC mediante la plantilla de MVC de Visual Studio 2013
- Configuración de EntityFramework para trabajar con un proveedor de bases de datos MySQL
- Ejecución de la aplicación para comprobar los resultados
Al final de este tutorial, tendrá una aplicación MVC con el almacén de identidades de ASP.NET que usa una base de datos MySQL hospedada en Azure.
Creación de una instancia de base de datos MySQL en Azure
Inicie sesión en Azure Portal.
Haz clic en NUEVO en la parte inferior de la página y, a continuación, selecciona STORE:
En el Asistente para elegir un complemento , seleccione ClearDB MySQL Database y, a continuación, haga clic en la flecha Siguiente en la parte inferior del marco:
Mantenga el plan gratis predeterminado, cambie el nombre a IdentityMySQLDatabase, seleccione la región más cercana a usted y, a continuación, haga clic en la flecha Siguiente en la parte inferior del marco:
Haga clic en la marca de verificación COMPRAR para completar la creación de la base de datos.
Una vez creada la base de datos, puede administrarla desde la pestaña ADD-ONS del portal de administración. Para recuperar la información de conexión de la base de datos, haga clic en INFORMACIÓN DE CONEXIÓN en la parte inferior de la página:
Copie la cadena de conexión haciendo clic en el botón copiar por el campo CONNECTIONSTRING y guárdelo; Usará esta información más adelante en este tutorial para la aplicación MVC:
Creación de un proyecto de aplicación MVC
Para completar los pasos de esta sección del tutorial, primero deberá instalar Visual Studio Express 2013 para Web o Visual Studio 2013. Una vez instalado Visual Studio, siga estos pasos para crear un nuevo proyecto de aplicación MVC:
Abra Visual Studio 2103.
Haga clic en Nuevo proyecto en la página Inicio , o bien puede hacer clic en el menú Archivo y, a continuación, en Nuevo proyecto:
Cuando se muestre el cuadro de diálogo Nuevo proyecto , expanda Visual C# en la lista de plantillas, haga clic en Web y seleccione ASP.NET Aplicación web. Asigne al proyecto el nombre IdentityMySQLDemo y haga clic en Aceptar:
En el cuadro de diálogo Nuevo ASP.NET Proyecto , seleccione la plantilla MVC con las opciones predeterminadas; esto configurará cuentas de usuario individuales como método de autenticación. Haga clic en Aceptar:
Configuración de EntityFramework para trabajar con una base de datos MySQL
Actualización del ensamblado de Entity Framework para el proyecto
La aplicación MVC que se creó a partir de la plantilla de Visual Studio 2013 contiene una referencia al paquete EntityFramework 6.0.0 , pero ha habido actualizaciones en ese ensamblado desde su versión que contienen mejoras de rendimiento significativas. Para usar estas actualizaciones más recientes en la aplicación, siga estos pasos.
Abra el proyecto MVC en Visual Studio.
Haga clic en Herramientas y, a continuación, en Administrador de paquetes NuGet y, a continuación, haga clic en Consola del Administrador de paquetes:
La consola del Administrador de paquetes aparecerá en la sección inferior de Visual Studio. Escriba "Update-Package EntityFramework" y presione Entrar:
Instalación del proveedor MySQL para EntityFramework
Para que EntityFramework se conecte a la base de datos MySQL, debe instalar un proveedor de MySQL. Para ello, abra la consola del Administrador de paquetes y escriba "Install-Package MySql.Data.Entity -Pre" y presione Entrar.
Nota:
Se trata de una versión preliminar del ensamblado y, como tal, puede contener errores. No debe usar una versión preliminar del proveedor en producción.
[Haga clic en la siguiente imagen para expandirla.]
Realizar cambios en la configuración del proyecto en el archivo Web.config de la aplicación
En esta sección, configurará Entity Framework para que use el proveedor mySQL que acaba de instalar, registre el generador de proveedores de MySQL y agregue la cadena de conexión desde Azure.
Nota:
Los ejemplos siguientes contienen una versión de ensamblado específica para MySql.Data.dll. Si cambia la versión del ensamblado, deberá modificar las opciones de configuración adecuadas con la versión correcta.
Abra el archivo Web.config del proyecto en Visual Studio 2013.
Busque las siguientes opciones de configuración, que definen el proveedor de base de datos predeterminado y el generador para Entity Framework:
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>Reemplace esos valores de configuración por lo siguiente, que configurará Entity Framework para que use el proveedor MySQL:
<entityFramework> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity"/> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove invariant="MySql.Data.MySqlClient"></remove> <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.7.2.0"/> </DbProviderFactories> </system.data>Busque la <sección connectionStrings> y reemplácela por el código siguiente, que definirá la cadena de conexión para la base de datos MySQL hospedada en Azure (tenga en cuenta que el valor providerName también ha cambiado del original):
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
La adición de un contexto de historial de migración personalizado
Entity Framework Code First usa una tabla MigrationHistory para realizar un seguimiento de los cambios del modelo y garantizar la coherencia entre el esquema de la base de datos y el esquema conceptual. Sin embargo, esta tabla no funciona para MySQL de forma predeterminada porque la clave principal es demasiado grande. Para solucionar esta situación, deberá reducir el tamaño de la clave de esa tabla. Para ello, siga estos pasos:
La información de esquema de esta tabla se captura en un HistoryContext, que se puede modificar como cualquier otro DbContext. Para ello, agregue un nuevo archivo de clase denominado MySqlHistoryContext.cs al proyecto y reemplace su contenido por el código siguiente:
using System.Data.Common; using System.Data.Entity; using System.Data.Entity.Migrations.History; namespace IdentityMySQLDemo { public class MySqlHistoryContext : HistoryContext { public MySqlHistoryContext( DbConnection existingConnection, string defaultSchema) : base(existingConnection, defaultSchema) { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<HistoryRow>().Property(h => h.MigrationId).HasMaxLength(100).IsRequired(); modelBuilder.Entity<HistoryRow>().Property(h => h.ContextKey).HasMaxLength(200).IsRequired(); } } }A continuación, deberá configurar Entity Framework para que use HistoryContext modificado, en lugar de uno predeterminado. Esto se puede hacer aprovechando las características de configuración basadas en código. Para ello, agregue un nuevo archivo de clase denominado MySqlConfiguration.cs al proyecto y reemplace su contenido por:
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Creación de un inicializador EntityFramework personalizado para ApplicationDbContext
El proveedor MySQL que se incluye en este tutorial no admite actualmente migraciones de Entity Framework, por lo que deberá usar inicializadores de modelos para conectarse a la base de datos. Dado que este tutorial usa una instancia de MySQL en Azure, deberá crear un inicializador personalizado de Entity Framework.
Nota:
Este paso no es necesario si se conecta a una instancia de SQL Server en Azure o si usa una base de datos hospedada en el entorno local.
Para crear un inicializador de Entity Framework personalizado para MySQL, siga estos pasos:
Agregue un nuevo archivo de clase denominado MySqlInitializer.cs al proyecto y reemplace su contenido por el código siguiente:
using IdentityMySQLDemo.Models; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Linq; namespace IdentityMySQLDemo { public class MySqlInitializer : IDatabaseInitializer<ApplicationDbContext> { public 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>( "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'IdentityMySQLDatabase' AND table_name = '__MigrationHistory'"); // if MigrationHistory table is not there (which is the case first time we run) - create it if (migrationHistoryTableExists.FirstOrDefault() == 0) { context.Database.Delete(); context.Database.Create(); } } } } }Abra el archivo IdentityModels.cs del proyecto, que se encuentra en el directorio Models y reemplace el contenido por lo siguiente:
using Microsoft.AspNet.Identity.EntityFramework; using System.Data.Entity; namespace IdentityMySQLDemo.Models { // You can add profile data for the user by adding more properties to your ApplicationUser // class, please visit https://go.microsoft.com/fwlink/?LinkID=317594 to learn more. public class ApplicationUser : IdentityUser { } public class ApplicationDbContext : IdentityDbContext<ApplicationUser> { static ApplicationDbContext() { Database.SetInitializer(new MySqlInitializer()); } public ApplicationDbContext() : base("DefaultConnection") { } } }
Ejecución de la aplicación y comprobación de la base de datos
Una vez que haya completado los pasos de las secciones anteriores, debe probar la base de datos. Para ello, siga estos pasos:
Presione Ctrl + F5 para compilar y ejecutar la aplicación web.
Haga clic en la pestaña Registrar de la parte superior de la página:
Escriba un nuevo nombre de usuario y una contraseña y, a continuación, haga clic en Registrar:
En este momento, las tablas ASP.NET Identity se crean en la base de datos MySQL y el usuario se registra e inicia sesión en la aplicación:
Instalación de la herramienta MySQL Workbench para comprobar los datos
Instalación de la herramienta MySQL Workbench desde la página de descargas de MySQL
En el Asistente para la instalación: pestaña Selección de características , seleccione MySQL Workbench en la sección aplicaciones .
Inicie la aplicación y agregue una nueva conexión mediante los datos de cadena de conexión de la base de datos de Azure MySQL que creó al principio de este tutorial.
Después de establecer la conexión, inspeccione las tablas ASP.NET Identity creadas en IdentityMySQLDatabase.
Verá que todas las tablas necesarias de identidad de ASP.NET se crean como se muestra en la imagen siguiente:
Inspeccione la tabla aspnetusers para que, por ejemplo, compruebe las entradas a medida que registra nuevos usuarios.














