ASP.NET Identity: używanie usługi MySQL Storage z dostawcą MySQL programu EntityFramework (C#)
Autor: Maurycy Markowski, Raquel Soares De Almeida, Robert McMurray
W tym samouczku pokazano, jak zastąpić domyślny mechanizm przechowywania danych dla ASP.NET Identity dostawcą EntityFramework (dostawcą klienta SQL) dostawcą mySQL.
Następujące tematy zostaną omówione w tym samouczku:
- Tworzenie bazy danych MySQL na platformie Azure
- Tworzenie aplikacji MVC przy użyciu szablonu Visual Studio 2013 MVC
- Konfigurowanie elementu EntityFramework do pracy z dostawcą bazy danych MySQL
- Uruchamianie aplikacji w celu zweryfikowania wyników
Na końcu tego samouczka będziesz mieć aplikację MVC z magazynem ASP.NET Identity, który korzysta z bazy danych MySQL hostowanej na platformie Azure.
Tworzenie wystąpienia bazy danych MySQL na platformie Azure
Zaloguj się do witryny Azure Portal.
Kliknij pozycję NOWY w dolnej części strony, a następnie wybierz pozycję SKLEP:
W kreatorze Wybieranie dodatku wybierz pozycję ClearDB MySQL Database, a następnie kliknij strzałkę Dalej w dolnej części ramki:
Zachowaj domyślny plan Bezpłatny , zmień nazwę naIdentityMySQLDatabase, wybierz region znajdujący się najbliżej Ciebie, a następnie kliknij strzałkę Dalej w dolnej części ramki:
Kliknij znacznik wyboru ZAKUP , aby ukończyć tworzenie bazy danych.
Po utworzeniu bazy danych możesz zarządzać nią z poziomu karty ADD-ONS w portalu zarządzania. Aby pobrać informacje o połączeniu dla bazy danych, kliknij pozycję INFORMACJE O POŁĄCZENIU w dolnej części strony:
Skopiuj parametry połączenia, klikając przycisk kopiowania przez pole CONNECTIONSTRING i zapisując je; Te informacje będą używane w dalszej części tego samouczka dla aplikacji MVC:
Tworzenie projektu aplikacji MVC
Aby wykonać kroki opisane w tej sekcji samouczka, należy najpierw zainstalować Visual Studio Express 2013 dla sieci Web lub Visual Studio 2013. Po zainstalowaniu programu Visual Studio wykonaj następujące kroki, aby utworzyć nowy projekt aplikacji MVC:
Otwórz program Visual Studio 2103.
Kliknij pozycję Nowy projekt na stronie Start lub kliknij menu Plik , a następnie pozycję Nowy projekt:
Po wyświetleniu okna dialogowego Nowy projekt rozwiń węzeł Visual C# na liście szablonów, a następnie kliknij pozycję Internet, a następnie wybierz pozycję ASP.NET Aplikacja internetowa. Nadaj projektowi nazwę IdentityMySQLDemo , a następnie kliknij przycisk OK:
W oknie dialogowym Nowy projekt ASP.NET wybierz szablon MVC z opcjami domyślnymi; Spowoduje to skonfigurowanie indywidualnych kont użytkowników jako metody uwierzytelniania. Kliknij przycisk OK:
Konfigurowanie elementu EntityFramework do pracy z bazą danych MySQL
Aktualizowanie zestawu platformy Entity Framework dla projektu
Aplikacja MVC utworzona na podstawie szablonu Visual Studio 2013 zawiera odwołanie do pakietu EntityFramework 6.0.0, ale od czasu wydania wprowadzono aktualizacje tego zestawu, które zawierają znaczne ulepszenia wydajności. Aby użyć tych najnowszych aktualizacji w aplikacji, wykonaj następujące kroki.
Otwórz projekt MVC w programie Visual Studio.
Kliknij pozycję Narzędzia, a następnie kliknij pozycję Menedżer pakietów NuGet, a następnie kliknij pozycję Konsola menedżera pakietów:
Konsola menedżera pakietów zostanie wyświetlona w dolnej sekcji programu Visual Studio. Wpisz "Update-Package EntityFramework" i naciśnij klawisz Enter:
Instalowanie dostawcy MySQL dla elementu EntityFramework
Aby element EntityFramework łączył się z bazą danych MySQL, należy zainstalować dostawcę MySQL. W tym celu otwórz konsolę menedżera pakietów i wpisz "Install-Package MySql.Data.Entity -Pre", a następnie naciśnij klawisz Enter.
Uwaga
Jest to wersja wstępna zestawu i w związku z tym może zawierać usterki. Nie należy używać wersji wstępnej dostawcy w środowisku produkcyjnym.
[Kliknij poniższy obraz, aby go rozwinąć.]
Wprowadzanie zmian konfiguracji projektu w pliku Web.config dla aplikacji
W tej sekcji skonfigurujesz program Entity Framework tak, aby korzystał z zainstalowanego dostawcy MySQL, zarejestrował fabrykę dostawcy MySQL i dodał parametry połączenia z platformy Azure.
Uwaga
Poniższe przykłady zawierają określoną wersję zestawu dla MySql.Data.dll. Jeśli wersja zestawu ulegnie zmianie, należy zmodyfikować odpowiednie ustawienia konfiguracji przy użyciu poprawnej wersji.
Otwórz plik Web.config dla projektu w Visual Studio 2013.
Znajdź następujące ustawienia konfiguracji, które definiują domyślnego dostawcę bazy danych i fabrykę dla programu 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>
Zastąp te ustawienia konfiguracji następującymi ustawieniami, co spowoduje skonfigurowanie programu Entity Framework do korzystania z dostawcy 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>
Znajdź sekcję <connectionStrings> i zastąp ją następującym kodem, który zdefiniuje parametry połączenia dla bazy danych MySQL hostowanej na platformie Azure (pamiętaj, że wartość providerName została również zmieniona z oryginalnej):
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
Dodawanie niestandardowego kontekstu MigrationHistory
Program Entity Framework Code First używa tabeli MigrationHistory do śledzenia zmian modelu i zapewnienia spójności między schematem bazy danych a schematem koncepcyjnym. Jednak ta tabela nie działa domyślnie dla bazy danych MySQL, ponieważ klucz podstawowy jest zbyt duży. Aby rozwiązać ten problem, należy zmniejszyć rozmiar klucza dla tej tabeli. Aby to zrobić, wykonaj następujące kroki:
Informacje o schemacie dla tej tabeli są przechwytywane w obiekcie HistoryContext, który można zmodyfikować jako dowolny inny element DbContext. W tym celu dodaj do projektu nowy plik klasy o nazwie MySqlHistoryContext.cs i zastąp jego zawartość następującym kodem:
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(); } } }
Następnie należy skonfigurować program Entity Framework tak, aby używał zmodyfikowanego obiektu HistoryContext, a nie domyślnego. Można to zrobić, korzystając z funkcji konfiguracji opartych na kodzie. W tym celu dodaj nowy plik klasy o nazwie MySqlConfiguration.cs do projektu i zastąp jego zawartość:
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Tworzenie niestandardowego inicjatora EntityFramework dla obiektu ApplicationDbContext
Dostawca MySQL, który jest opisywany w tym samouczku, nie obsługuje obecnie migracji programu Entity Framework, dlatego należy użyć inicjatorów modelu w celu nawiązania połączenia z bazą danych. Ponieważ w tym samouczku jest używane wystąpienie bazy danych MySQL na platformie Azure, należy utworzyć niestandardowy inicjator platformy Entity Framework.
Uwaga
Ten krok nie jest wymagany, jeśli nawiązujesz połączenie z wystąpieniem SQL Server na platformie Azure lub jeśli używasz bazy danych hostowanej lokalnie.
Aby utworzyć niestandardowy inicjator programu Entity Framework dla programu MySQL, wykonaj następujące kroki:
Dodaj nowy plik klasy o nazwie MySqlInitializer.cs do projektu i zastąp jego zawartość następującym kodem:
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(); } } } } }
Otwórz plik IdentityModels.cs projektu, który znajduje się w katalogu Models , i zastąp jego zawartość następującym kodem:
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") { } } }
Uruchamianie aplikacji i weryfikowanie bazy danych
Po wykonaniu kroków opisanych w poprzednich sekcjach należy przetestować bazę danych. Aby to zrobić, wykonaj następujące kroki:
Naciśnij klawisze Ctrl + F5 , aby skompilować i uruchomić aplikację internetową.
Kliknij kartę Zarejestruj w górnej części strony:
Wprowadź nową nazwę użytkownika i hasło, a następnie kliknij przycisk Zarejestruj:
Na tym etapie tabele ASP.NET Identity są tworzone w bazie danych MySQL, a użytkownik jest zarejestrowany i zalogowany w aplikacji:
Instalowanie narzędzia MySQL Workbench w celu zweryfikowania danych
Instalowanie narzędzia MySQL Workbench ze strony pobierania mySQL
W kreatorze instalacji: wybór funkcji wybierz pozycję MySQL Workbench w sekcji aplikacje .
Uruchom aplikację i dodaj nowe połączenie przy użyciu danych parametrów połączenia z bazy danych Azure MySQL utworzonej na początku tego samouczka.
Po nawiązaniu połączenia sprawdź tabele ASP.NET Identity utworzone w bazie danych IdentityMySQLDatabase.
Zobaczysz, że wszystkie tabele wymagane ASP.NET Identity są tworzone, jak pokazano na poniższej ilustracji:
Sprawdź tabelę aspnetusers na przykład, aby sprawdzić wpisy podczas rejestrowania nowych użytkowników.