Identidade do ASP.NET: Uso do Armazenamento do MySQL com um provedor de MySQL do EntityFramework (C#)
por Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray
Este tutorial mostra como substituir o mecanismo de armazenamento de dados padrão para ASP.NET Identity por EntityFramework (provedor cliente SQL) por um provedor MySQL.
Os seguintes tópicos serão abordados neste tutorial:
- Criando um banco de dados MySQL no Azure
- Criando um aplicativo MVC usando Visual Studio 2013 modelo MVC
- Configurando o EntityFramework para trabalhar com um provedor de banco de dados MySQL
- Executando o aplicativo para verificar os resultados
No final deste tutorial, você terá um aplicativo MVC com o repositório ASP.NET Identity que está usando um banco de dados MySQL hospedado no Azure.
Criando uma instância de banco de dados MySQL no Azure
Faça logon no Portal do Azure.
Clique em NOVO na parte inferior da página e selecione STORE:
No assistente Escolher um Complemento , selecione Limpar Banco de Dados MySQL do ClearDB e clique na seta Avançar na parte inferior do quadro:
Mantenha o plano gratuito padrão, altere o NOME para IdentityMySQLDatabase, selecione a região mais próxima de você e clique na seta Avançar na parte inferior do quadro:
Clique na marca de seleção PURCHASE para concluir a criação do banco de dados.
Depois que o banco de dados tiver sido criado, você pode gerenciá-lo na guia COMPLEMENTOS no portal de gerenciamento. Para recuperar as informações de conexão do banco de dados, clique em INFORMAÇÕES DE CONEXÃO na parte inferior da página:
Copie a cadeia de conexão clicando no botão copiar pelo campo CONNECTIONSTRING e salve-a; você usará essas informações mais adiante neste tutorial para seu aplicativo MVC:
Criando um projeto de aplicativo MVC
Para concluir as etapas nesta seção do tutorial, primeiro você precisará instalar o Visual Studio Express 2013 para Web ou Visual Studio 2013. Depois que o Visual Studio tiver sido instalado, use as seguintes etapas para criar um novo projeto de aplicativo MVC:
Abra o Visual Studio 2103.
Clique em Novo Projeto na página Iniciar ou clique no menu Arquivo e em Novo Projeto:
Quando a caixa de diálogo Novo Projeto for exibida, expanda Visual C# na lista de modelos, clique em Web e selecione ASP.NET Aplicativo Web. Nomeie seu projeto IdentityMySQLDemo e clique em OK:
Na caixa de diálogo Novo projeto ASP.NET , selecione o modelo MVC com as opções padrão; isso configurará contas de usuário individuais como o método de autenticação. Clique em OK:
Configurar o EntityFramework para trabalhar com um banco de dados MySQL
Atualizar o assembly do Entity Framework para seu projeto
O aplicativo MVC que foi criado a partir do modelo Visual Studio 2013 contém uma referência ao pacote EntityFramework 6.0.0, mas houve atualizações para esse assembly desde sua versão que contêm melhorias significativas de desempenho. Para usar essas atualizações mais recentes em seu aplicativo, use as etapas a seguir.
Abra seu projeto MVC no Visual Studio.
Clique em Ferramentas e, em seguida, clique em Gerenciador de Pacotes NuGet e, em seguida, clique em Console do Gerenciador de Pacotes:
O Console do Gerenciador de Pacotes será exibido na seção inferior do Visual Studio. Digite "Update-Package EntityFramework" e pressione Enter:
Instalar o provedor MySQL para EntityFramework
Para que o EntityFramework se conecte ao banco de dados MySQL, você precisa instalar um provedor MySQL. Para fazer isso, abra o Console do Gerenciador de Pacotes e digite "Install-Package MySql.Data.Entity -Pre" e pressione Enter.
Observação
Essa é uma versão de pré-lançamento do assembly e, como tal, pode conter bugs. Você não deve usar uma versão de pré-lançamento do provedor em produção.
[Clique na imagem a seguir para expandi-la.]
Fazendo alterações de configuração de projeto no arquivo Web.config para seu aplicativo
Nesta seção, você configurará o Entity Framework para usar o provedor MySQL que acabou de instalar, registrar a fábrica do provedor MySQL e adicionar sua cadeia de conexão do Azure.
Observação
Os exemplos a seguir contêm uma versão de assembly específica para MySql.Data.dll. Se a versão do assembly for alterada, você precisará modificar as configurações apropriadas com a versão correta.
Abra o arquivo de Web.config do projeto no Visual Studio 2013.
Localize as seguintes configurações, que definem o provedor de banco de dados padrão e a fábrica para o 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>
Substitua essas configurações pelo seguinte, que definirá o Entity Framework para usar o provedor 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>
Localize a <seção connectionStrings> e substitua-a pelo código a seguir, que definirá a cadeia de conexão do banco de dados MySQL hospedado no Azure (observe que o valor providerName também foi alterado do original):
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
Adicionar contexto migrationhistory personalizado
O Entity Framework Code First usa uma tabela MigrationHistory para acompanhar as alterações de modelo e garantir a consistência entre o esquema de banco de dados e o esquema conceitual. No entanto, essa tabela não funciona para MySQL por padrão porque a chave primária é muito grande. Para corrigir essa situação, você precisará reduzir o tamanho da chave dessa tabela. Para fazer isso, execute as seguintes etapas:
As informações de esquema dessa tabela são capturadas em um HistoryContext, que pode ser modificado como qualquer outro DbContext. Para fazer isso, adicione um novo arquivo de classe chamado MySqlHistoryContext.cs ao projeto e substitua seu conteúdo pelo seguinte código:
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(); } } }
Em seguida, você precisará configurar o Entity Framework para usar o HistoryContext modificado, em vez do padrão. Isso pode ser feito aproveitando os recursos de configuração baseados em código. Para fazer isso, adicione um novo arquivo de classe chamado MySqlConfiguration.cs ao seu projeto e substitua seu conteúdo por:
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Criando um inicializador EntityFramework personalizado para ApplicationDbContext
O provedor MySQL que é apresentado neste tutorial atualmente não dá suporte a migrações do Entity Framework, portanto, você precisará usar inicializadores de modelo para se conectar ao banco de dados. Como este tutorial está usando uma instância do MySQL no Azure, você precisará criar um inicializador personalizado do Entity Framework.
Observação
Essa etapa não será necessária se você estiver se conectando a uma instância de SQL Server no Azure ou se estiver usando um banco de dados hospedado localmente.
Para criar um inicializador personalizado do Entity Framework para MySQL, use as seguintes etapas:
Adicione um novo arquivo de classe chamado MySqlInitializer.cs ao projeto e substitua seu conteúdo pelo seguinte código:
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 o arquivo IdentityModels.cs para seu projeto, que está localizado no diretório Modelos , e substitua seu conteúdo pelo seguinte:
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") { } } }
Executando o aplicativo e verificando o banco de dados
Depois de concluir as etapas nas seções anteriores, você deve testar seu banco de dados. Para fazer isso, execute as seguintes etapas:
Pressione Ctrl + F5 para compilar e executar o aplicativo Web.
Clique na guia Registrar na parte superior da página:
Insira um novo nome de usuário e senha e clique em Registrar:
Neste ponto, as tabelas ASP.NET Identity são criadas no Banco de Dados MySQL e o usuário está registrado e conectado ao aplicativo:
Instalando a ferramenta MySQL Workbench para verificar os dados
Instalar a ferramenta MySQL Workbench na página de downloads do MySQL
No assistente de instalação: guia Seleção de Recursos , selecione MySQL Workbench na seção aplicativos .
Inicie o aplicativo e adicione uma nova conexão usando os dados de cadeia de conexão do banco de dados MySQL do Azure criado no início deste tutorial.
Depois de estabelecer a conexão, inspecione as tabelas ASP.NET Identity criadas no IdentityMySQLDatabase.
Você verá que todas as tabelas necessárias ASP.NET Identity são criadas conforme mostrado na imagem abaixo:
Inspecione a tabela aspnetusers, por exemplo, para marcar as entradas conforme você registra novos usuários.