Compartilhar via


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

  1. Faça logon no Portal do Azure.

  2. Clique em NOVO na parte inferior da página e selecione STORE:

    Captura de tela do menu portal do Azure com o item de menu Da Loja realçado na parte inferior e descrito com um retângulo vermelho.

  3. No assistente Escolher um Complemento , selecione Limpar Banco de Dados MySQL do ClearDB e clique na seta Avançar na parte inferior do quadro:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do assistente Escolher um Complemento, com o Banco de Dados Clear D B My S Q L realçado com um retângulo vermelho.

  4. 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 imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo Personalizar Complemento mostrando a opção Plano gratuito e os campos Nome e região selecionados e realçados com um retângulo vermelho.

  5. Clique na marca de seleção PURCHASE para concluir a criação do banco de dados.

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo Revisar Compra mostrando o botão Comprar realçado com um retângulo vermelho.

  6. 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:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do portal de gerenciamento com a guia Adicionar Ons, o item identificar meu banco de dados Q L e o botão Informações de Conexão realçados em vermelho.

  7. 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:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo Informações de conexão com o botão copiar realçado à direita do campo Cadeia de Conexão.

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:

  1. Abra o Visual Studio 2103.

  2. Clique em Novo Projeto na página Iniciar ou clique no menu Arquivo e em Novo Projeto:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da página inicial do Visual Studio mostrando a opção Novo Projeto realçada com um retângulo vermelho.

  3. 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:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo Novo Projeto, com a marca de hash do Visual C expandida à esquerda e na Web realçada. Aplicativo Web asp dot NET selecionado à direita com o nome do projeto Identity My S Q L Demo no campo nome na parte inferior.

  4. 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:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo Novo Projeto DOT NET do A SP, com o modelo M V C selecionado e as opções padrão marcadas.

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.

  1. Abra seu projeto MVC no Visual Studio.

  2. Clique em Ferramentas e, em seguida, clique em Gerenciador de Pacotes NuGet e, em seguida, clique em Console do Gerenciador de Pacotes:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do projeto M V C no Visual Studio, com Ferramentas selecionadas no menu superior, Gerenciador de Pacotes de Biblioteca selecionado à esquerda e Console do Gerenciador de Pacotes selecionado à direita.

  3. O Console do Gerenciador de Pacotes será exibido na seção inferior do Visual Studio. Digite "Update-Package EntityFramework" e pressione Enter:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do Console do Gerenciador de Pacotes na seção inferior do Visual Studio, com a instrução Atualizar Estrutura de Entidade do Pacote exibida na linha de comando.

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.]

Captura de tela do Console do Gerenciador de Pacotes na seção inferior do Visual Studio, com Install-Package My S q l dot Data dot Entity dash Pré-instrução exibida na linha de comando.

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.

  1. Abra o arquivo de Web.config do projeto no Visual Studio 2013.

  2. 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>
    
  3. 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>
    
  4. 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:

  1. 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();
        }
      }
    }
    
  2. 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:

  1. 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();
            }
          }
        }
      }
    }
    
  2. 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:

  1. Pressione Ctrl + F5 para compilar e executar o aplicativo Web.

  2. Clique na guia Registrar na parte superior da página:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do site do A SP dot NET, com a guia Registrar realçada no menu no canto superior direito.

  3. Insira um novo nome de usuário e senha e clique em Registrar:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo de registro A SP dot NET, com o nome de usuário, a senha e os campos de confirmação de senha concluídos e o botão Registrar realçado abaixo.

  4. 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:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela do site do A SP dot NET depois que o usuário concluiu o registro. A guia com saudação Olá, seguida pelo nome de usuário, é realçada no menu no canto superior direito.

Instalando a ferramenta MySQL Workbench para verificar os dados

  1. Instalar a ferramenta MySQL Workbench na página de downloads do MySQL

  2. No assistente de instalação: guia Seleção de Recursos , selecione MySQL Workbench na seção aplicativos .

  3. 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.

  4. Depois de estabelecer a conexão, inspecione as tabelas ASP.NET Identity criadas no IdentityMySQLDatabase.

  5. Você verá que todas as tabelas necessárias ASP.NET Identity são criadas conforme mostrado na imagem abaixo:

    [Clique na imagem a seguir para expandi-la. ] Captura de tela da caixa de diálogo da ferramenta My S Q L Workbench. As tabelas SP dot NET Identity criadas no Banco de Dados Identity My S Q L são realçadas no canto inferior esquerdo.

  6. Inspecione a tabela aspnetusers, por exemplo, para marcar as entradas conforme você registra novos usuários.

    [Clique na imagem a seguir para expandi-la. ] Captura de tela de uma tabela s p net users, com entradas exibindo as colunas ID, Nome de Usuário, Hash de Senha, Selo de Segurança e Discriminador.