ASP.NET Identity. Использование хранилища MySQL с помощью поставщика EntityFramework MySQL (C#)
Мориси Марковски, Ракель Соарес Де Алмейда, Роберт Мак-Мюррей
В этом руководстве показано, как заменить механизм хранения данных по умолчанию для ASP.NET Identity на EntityFramework (поставщик клиента SQL) поставщиком MySQL.
В этом руководстве рассматриваются следующие темы:
- Создание базы данных MySQL в Azure
- Создание приложения MVC с помощью шаблона MVC Visual Studio 2013
- Настройка EntityFramework для работы с поставщиком базы данных MySQL
- Запуск приложения для проверки результатов
В конце этого руководства у вас будет приложение MVC с хранилищем удостоверений ASP.NET, которое использует базу данных MySQL, размещенную в Azure.
Создание экземпляра базы данных MySQL в Azure
Войдите на портал Azure.
Нажмите кнопку СОЗДАТЬ в нижней части страницы, а затем выберите STORE:
В мастере выбора надстройки выберите ClearDB MySQL Database и щелкните стрелку Далее в нижней части кадра:
Оставьте план Бесплатный по умолчанию, измените имя на IdentityMySQLDatabase, выберите ближайший к вам регион и щелкните стрелку Далее в нижней части кадра:
Установите флажок КУПИТЬ , чтобы завершить создание базы данных.
После создания базой данных можно управлять на вкладке НАДСТРОЙКИ портала управления. Чтобы получить сведения о подключении для базы данных, щелкните Сведения о подключении в нижней части страницы:
Скопируйте строку подключения, нажав кнопку копирования в поле CONNECTIONSTRING , и сохраните ее; Эти сведения будут использоваться далее в этом руководстве для приложения MVC:
Создание проекта приложения MVC
Чтобы выполнить действия, описанные в этом разделе руководства, сначала необходимо установить Visual Studio Express 2013 для Web или Visual Studio 2013. После установки Visual Studio выполните следующие действия, чтобы создать проект приложения MVC:
Откройте Visual Studio 2103.
Щелкните Создать проект на начальной странице или выберите меню Файл и Создать проект:
Когда откроется диалоговое окно Новый проект , разверните visual C# в списке шаблонов, щелкните Интернет и выберите ASP.NET Веб-приложение. Назовите проект IdentityMySQLDemo и нажмите кнопку ОК:
В диалоговом окне Новый проект ASP.NET выберите шаблон MVC с параметрами по умолчанию; Это позволит настроить отдельные учетные записи пользователей в качестве метода проверки подлинности. Нажмите кнопку ОК:
Настройка EntityFramework для работы с базой данных MySQL
Обновление сборки Entity Framework для проекта
Приложение MVC, созданное на основе шаблона Visual Studio 2013, содержит ссылку на пакет EntityFramework 6.0.0, но с момента выпуска этой сборки были обновлены, которые содержат значительные улучшения производительности. Чтобы использовать эти последние обновления в приложении, выполните следующие действия.
Откройте проект MVC в Visual Studio.
Щелкните Сервис, затем диспетчер пакетов NuGet, а затем консоль диспетчера пакетов:
Консоль диспетчера пакетов появится в нижнем разделе Visual Studio. Введите "Update-Package EntityFramework" и нажмите клавишу ВВОД:
Установка поставщика MySQL для EntityFramework
Чтобы EntityFramework подключался к базе данных MySQL, необходимо установить поставщик MySQL. Для этого откройте консоль диспетчера пакетов и введите "Install-Package MySql.Data.Entity -Pre" и нажмите клавишу ВВОД.
Примечание
Это предварительная версия сборки, поэтому она может содержать ошибки. Не следует использовать предварительную версию поставщика в рабочей среде.
[Щелкните следующее изображение, чтобы развернуть его.]
Внесение изменений в конфигурацию проекта в файл Web.config для приложения
В этом разделе вы настроите Entity Framework для использования только что установленного поставщика MySQL, зарегистрируйте фабрику поставщиков MySQL и добавите строку подключения из Azure.
Примечание
Следующие примеры содержат определенную версию сборки для MySql.Data.dll. Если версия сборки меняется, необходимо изменить соответствующие параметры конфигурации, указав правильную версию.
Откройте файл Web.config проекта в Visual Studio 2013.
Найдите следующие параметры конфигурации, которые определяют поставщика базы данных по умолчанию и фабрику для 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>
Замените эти параметры конфигурации следующими параметрами, которые настроят Entity Framework для использования поставщика 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>
<Найдите раздел connectionStrings> и замените его следующим кодом, который определит строку подключения для базы данных MySQL, размещенной в Azure (обратите внимание, что значение providerName также было изменено по сравнению с исходной):
<connectionStrings> <add name="DefaultConnection" providerName="MySql.Data.MySqlClient" connectionString="[Insert your ConnectionString from Azure here]"/> </connectionStrings>
Добавление пользовательского контекста MigrationHistory
Entity Framework Code First использует таблицу MigrationHistory для отслеживания изменений модели и обеспечения согласованности между схемой базы данных и концептуальной схемой. Однако эта таблица не работает для MySQL по умолчанию, так как первичный ключ слишком велик. Чтобы устранить эту проблему, необходимо уменьшить размер ключа для этой таблицы. Для этого выполните следующие действия.
Сведения о схеме для этой таблицы записываются в historyContext, который можно изменить как любой другой DbContext. Для этого добавьте в проект новый файл класса MySqlHistoryContext.cs и замените его содержимое следующим кодом:
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(); } } }
Затем необходимо настроить Entity Framework для использования измененного HistoryContext, а не по умолчанию. Это можно сделать, используя функции конфигурации на основе кода. Для этого добавьте в проект новый файл класса MySqlConfiguration.cs и замените его содержимое следующим:
using System.Data.Entity; namespace IdentityMySQLDemo { public class MySqlConfiguration : DbConfiguration { public MySqlConfiguration() { SetHistoryContext( "MySql.Data.MySqlClient", (conn, schema) => new MySqlHistoryContext(conn, schema)); } } }
Создание пользовательского инициализатора EntityFramework для ApplicationDbContext
Поставщик MySQL, который рассматривается в этом руководстве, в настоящее время не поддерживает миграции Entity Framework, поэтому для подключения к базе данных потребуется использовать инициализаторы моделей. Так как в этом руководстве используется экземпляр MySQL в Azure, необходимо создать пользовательский инициализатор Entity Framework.
Примечание
Этот шаг не требуется, если вы подключаетесь к экземпляру SQL Server в Azure или используете базу данных, размещенную локально.
Чтобы создать пользовательский инициализатор Entity Framework для MySQL, выполните следующие действия.
Добавьте в проект новый файл класса с именем MySqlInitializer.cs и замените его содержимое следующим кодом:
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(); } } } } }
Откройте файл IdentityModels.cs для проекта, который находится в каталоге Models , и замените его содержимое следующим:
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") { } } }
Запуск приложения и проверка базы данных
После выполнения действий, описанных в предыдущих разделах, необходимо протестировать базу данных. Для этого выполните следующие действия.
Нажмите клавиши CTRL+F5 , чтобы выполнить сборку и запуск веб-приложения.
Откройте вкладку Регистрация в верхней части страницы:
Введите новое имя пользователя и пароль, а затем нажмите кнопку Зарегистрировать:
На этом этапе в базе данных MySQL создаются таблицы удостоверений ASP.NET, а пользователь регистрируется и входит в приложение:
Установка средства MySQL Workbench для проверки данных
Установка средства MySQL Workbench со страницы загрузки MySQL
На вкладке " Выбор компонентов " мастера установки выберите MySQL Workbench в разделе "Приложения ".
Запустите приложение и добавьте новое подключение, используя данные строки подключения из базы данных Azure MySQL, созданной в начале этого руководства.
После установки подключения проверьте таблицы ASP.NET Identity , созданные на базе данных IdentityMySQLDatabase.
Вы увидите, что все необходимые таблицы ASP.NET Identity создаются, как показано на рисунке ниже:
Проверьте таблицу aspnetusers, чтобы проверка записей при регистрации новых пользователей.