Entity framework где хранится база данных
В этой публикации хочу поделиться личным опытом использования Entity Framework (EF) в реальном приложении и дать несколько полезных советов использования данного фреймворка.
Еще раз хочу повторить, что, на мой взгляд, в enterprise приложении главное — это данные, а не ваше приложение. Приложения приходят и уходят, заменяются на более новые, а данные остаются и используются годами. Поэтому в любом моем приложении база данных всегда создается проектировщиком базы данных, а не моим приложением.
Первое, что нужно сделать, если у вас уже есть готовая база данных — это создать классы, которые бы соответствовали таблицам. Вручную это делать очень утомительно, поэтому:
Совет №1. Генерация класса на основе таблицы
Cкрипт T-SQL, который можно взять отсюда, реально работает и очень удобен.
Совет №2. Прегенерация view
Прегенерация view — это нечто, что происходит внутри фреймворка при выполнении первого запроса. Этот процесс можно перенести на этап компиляции вашего приложения, что существенно сократит скорость выполнения первого запроса. Для разных версий EF способы несколько отличаются. Я использовал этот подход и полностью остался им доволен.
Совет №3. Массовое обновление данных с помощью DetectChanges
По умолчанию фреймворк настроен на то, чтобы автоматически отслеживать изменения, которые затем нужно будет сохранить в базу данных.
Например, рассмотрим такой простой пример:
Запустив его, многие наверняка будут удивлены, что основное время будет потрачено не собственно на запрос к базе данных, а на вставку объектов в сам dbContext. Дело в том, что при изменении данных внутри DbContext-а происходит масса проверок и других малоизученных вещей, подробнее о которых можно прочесть здесь. Чтобы этого избежать можно отключить слежение за изменениями в классе DbContext, а затем явно вызвать метод DetectChanges(), который сам эти изменения обнаружит. Так, данный код будет работать значительно быстрее:
Совет №4. Следите за sql-запросами, которые формирует фреймворк
Это довольно универсальный совет, применимый, наверное, ко всем ORM, но многие почему-то о нем забывают. И после внедрения приложения, открыв профайлер и увидев 50 запросов к БД для показа довольно простой формы, бывают крайне удивлены.
Между тем, фреймворк предлагает механизмы для некоторой оптимизации. Среди этих механизмов наиболее известный — метод Include, который «вытягивает» дочерние объекты в том же запросе. Например:
Совет №5. Изолируйте логику работы с базой данных
Хотя в названии EF есть слово «фреймворк», его можно использовать и как обычную библиотеку просто для упрощения работы с базой данных.
В большинстве книг и презентаций мы видим код, похожий на этот:
Проблема этого кода в том, что он плотно привязывает все части приложения к Entity Framework. Это не хорошо и не плохо само по себе, но при этом вы должны понимать, что существенно осложняете себе жизнь, если архитектуру доступа к данным придется менять. А вариантов тут может быть масса:
- Вы внезапно обнаружите, что определенный запрос работает крайне медленно и решите заменить его на хранимую процедуру или View
- Вы с удивлением обнаружите, насколько сложно сохранять данные, полученные в разных DbContext-ах
- Вы с удивлением будете наблюдать классы TransactionScope, DbConnection внутри контроллера, когда понадобится нетривиальная логика обновления данных
- Вы задумаетесь о повторном использовании кода для работы с БД
- Вы решите использовать вместо EF NHibernate
- А почему бы не использовать SOA архитектуру, и не начать получать и сохранять данные через веб-сервисы?
Этот подход хорош тем, что ваше приложение будет знать только о ваших объектах и о том, как их можно получить из БД и как сохранить в БД. Поверьте, этим вы существенно облегчите себе жизнь.
-
или Visual Web Developer Express 2010 SP1 (если вы используете для установки одну из этих ссылок, следующий софт установится автоматически)
The Contoso University
Приложение, которые вы разработаете, является простым вебсайтом университета.
Пользователи смогут просматривать и обновлять данные о студентах, курсах и преподавателях. Несколько скриншотов того, что получится, ниже.
UI близок по стилю к тому, что генерируется шаблонами по умолчанию, поэтому акцент будет на вопросах использования Entity Framework.
Подходы к разработке с Entity Framework
Исхоя из диаграммы, имеется три подхода к работе с данными в Entity Framework: Database First, Model First, и Code First.
Database First
В случае уже имеющейся базы данных Entity Framework может автоматически создать модель данных, состоящую из классов и свойств, соответствующих объектам базы даных (таким, как таблицы и столбцы). Информация о структуре базы (store schema), модель данных (conceptual model) и маппинг их друг на друга содержится в XML в файле .edmx. Visual Studio предоставляет графический дизайнер Entity Framework, с помощью которого можно просматривать и редактировать .edmx. Части Getting Started With the Entity Framework и Continuing With the Entity Framework в материалах о Web Forms используют подход Database First.
Model First
Если базы нет, вы можете начать с создания модели данных, используя дизайнер Entity Framework Visual Studio. После окончания работ над моделью дизайнер сгенерирует DDL (data definition language)-код для создания базы. В этом подходе для хранения информации о модели и маппингах также используется .edmx. What's New in the Entity Framework 4 включает небольшой пример разработки с использованием данного подхода.
Code First
Вне зависимости от наличия базы вы можете вручную написать код классов и свойств, соответствующих сущностям в базе и использовать этот код с Entity Framework без использования файла .edmx. Именно поэтому можно порой увидеть, как этот подход называют code only, хотя официальное наименование Code First. Маппинг между store schema и conceptual model в represented by your code is handled by convention and by a special mapping API. Если базы ещё нет, Entity Framework может создать, удалить или пересоздать её в случае изменений в модели.
API доступа к данным, разработанное для Code First, основано на классе DbContext . API может быть использован также и в процессе разработки с подходами Database First и Model First. Для дополнительной информации смотрите When is Code First not code first? В блоге команды разработки Entity Framework.
POCO (Plain Old CLR Objects)
По умолчанию для подходов Database First и Model First классы модели данных наследуются от EntityObject, который и предоставляет функциональность Entity Framework. Это значит, что эти классы не являются persistence ignorant и, таким образом, не полностью соответствуют одном из условий domain-driven design. Все подходы к разработке с Entity Framework также могут работать с POCO (plain old CLR objects), что, в целом, значит, что они являются persistence-ignorant из-за отсутствия наследования EntityObject .
Создание веб-приложения MVC
Настройка стилей
Несколько небольших поправок изменят меню сайта, расположение элементов и домашнюю страницу.
Для настройки меню Contoso University, в Views\Shared\_Layout.cshtml замените текст в h 1 и ссылки в меню, как в примере:
В Views\Home\Index.cshtml удалите всё в теге h2 .
В Controllers\HomeController.cs замените "Welcome to ASP.NET MVC!" на "Welcome to Contoso University!"
В Content\Site.css для смещения меню влево совершите следующие изменения:
Создание модели данных
Далее создадим первые классы-сущности для Contoso University. Мы начнём со следующих трёх сущностей:
Установлена связь один-ко-многим между сущностями Student и Enrollment , и связь один-ко-многим между Course и Enrollment . Другими словами, студент может посещать любое количество курсов, и курс может иметь любое количество студентов, посещающих его.
В дальнейшем вы создадите классы для каждой из этих сущностей.
Note: компиляция проекта без созданных классов для этих сущностей вызовет ошибки компиляторов.
Сущность Student
В папке Models создайте Student.cs и замените сгенерированный код на:
Свойство StudentID будет первичным ключом соответствующей таблицы. По умолчанию, Entity Framework воспринимает свойство с ID или classname ID как первичный ключ.
Свойство Enrollments — navigation property. Navigation properties содержат другие сущности, относящиеся к текущей. В данном случае свойство Enrollments содержит в себе все сущности Enrollment , ассоциированные с текущей сущностью Student . Другими словами, если некая запись Student в базе данных имеет связь с двумя записями Enrollment (записей, содержащих значения первичных ключей для студента в поле внешнего ключа StudentID ), свойство этой записи Enrollments будет содержать две сущности Enrollment .
Navigation properties обычно помечаются модификатором virtual дабы использовать возможность Entity Framework, называемую lazy loading. (суть Lazy loading будет объяснена позже, в Reading Related Data) Если navigation property может содержать несколько сущностей (в связях многие-ко-многим и один-ко-многим), его тип должен быть ICollection .
Сущность Enrollment
В папке Models создайте Enrollment.cs со следующим содержанием:
Знак вопроса после указания типа decimal указывает на то, что свойство Grade nullable. Оценка, поставленная в null отличная от нулевой оценки— null обозначает то, что оценка еще не выставлена, тогда как 0 – уже значение.
Свойство StudentID является внешним ключом, и соответствующее navigation property Student . Сущность Enrollment ассоциирована с одной сущностью Student , поэтому свойство может содержать только одну сущность указанного типа (в отличие Student . Enrollments ).
Свойство CourseID является внешним ключом, и соответствующее navigation property Course . Сущность Enrollment ассоциирована с одной сущностью Course .
Сущность Course
В папке Models создайтеCourse.cs со следующим содержанием:
Свойство Enrollments — navigation property. Сущность Course может ассоциироваться с бесконечным множеством сущностей Enrollment .
Создание Database Context
Главный класс, координирующий функциональность Entity Framework для текущей модели данных называется database context. Данный класс наследуется от System . Data . Entity . DbContext . В коде вы определяете, какие сущности включить в модель данных, и также можете определять поведение самого Entity Framework. В нашем коде этот класс имеет название SchoolContext .
Создайте папку DAL и в ней новый класс SchoolContext.cs:
Код создаёт свойство DbSet для каждого множества сущностей. В терминологии Entity Framework множество сущностей (entity set) относится к таблице базы данных, и сущность относится к записи в таблице.
Содержимое метода OnModelCreating защищает имена таблиц от плюрализации, и, если вы этого не делаете, то получаете такие имена таблиц, как Students , Courses , Enrollments . В ином случае имена таблиц будут Student , Course , Enrollment . Разработчики спорят на тему того, нужно ли плюрализовывать имена таблиц или нет. Мы используем одиночную форму, но важен тот момент, что вы можете выбрать, включать эту строчку в код или нет.
(Этот класс находится в namespace Models потому, что в некоторых ситуациях подход Code First подразумевает нахождение классов сущностей и контекста в одном и том же namespace.)
Определение Connection String
Вам не нужно определять connection string. Если вы не определили эту строку, Entity Framework автоматически создаст базу данных SQL Server Express. Мы, однако, будем работать с SQL Server Compact, и вам необходимо будет создать строку подключения с указанием на это.
Откройте Web.config и добавьте новую строку подключения в коллекцию connectionStrings . (Убедитесь, что вы обновляете Web.config в корне проекта, так как есть еще один Web.config в папке Views, который трогать не надо.)
По умолчанию Entity Framework ищет строку подключения, названную также как object context class. Строка подключения, которую вы добавили, определяет базу данных School.sdf, находящуюся в папке App_data и SQL Server Compact.
Инициализация базы данных с тестовыми данными
Entity Framework может автоматически создать базу данных при запуске приложения. Вы можете указать, что это должно выплоняться при каждом запуске приложения или только тогда, когда модель рассинхронизирована с существующей базой. Вы можете также написать класс с методом, который Entity Framework будет автоматически вызывать перед созданием базы для использования её с тестовыми данными. Мы укажем, что база должна удаляться и пересоздаваться при изменении модели.
В папке DAL создайте новый класс SchoolInitializer.cs с кодом, с помощью которого база будет создана при необходимости и заполнена тестовыми данными.
Метод Seed принимает объект контекста базы как входящий параметр и использует его для добавления новых сущностей в базу. Для каждого типа сущности код создает коллекцию новых сущностей, добавляя их в соответствующее свойство DbSet, и потом сохраняет изменения в базу. Нет необходимости в вызове SaveChanges после каждой группы сущностей, как сделано у нас, но это помогает определить проблему в случае возникновения исключений.
Измените Global.asax.cs для того, чтобы наш код вызывался при каждом запуске приложения:
- Добавьте using :
- В методе Application_Start вызовите метод Entity Framework, который запускает код инициализации базы:
Note при развертывании приложения на продакшн-сервер вы должны удалить весь код, который инициализирует базу тестовыми данными.
Далее вы создадите веб-страницу для отображения данных, и процесс запроса данных автоматически инициирует создание базы. Вы начнете с нового контроллера, но перед этим, соберите проект для того, чтобы модель и контекстные классы стали доступны для MVC controller scaffolding.
Создание контроллера Student
Для создание контроллера Student , щелкните на папке Controllers в Solution Explorer, нажмите Add, Controller. В Add Controller совершите следующие действия и изменения и нажмите Add:
- Controller name: StudentController.
- Template: Controller with read/write actions and views, using Entity Framework. (по умолчанию.)
- Model class: Student (ContosoUniversity.Models). (если этого нет, пересоберите проект)
- Data context class: SchoolContext (ContosoUniversity.Models).
- Views: Razor (CSHTML). (по умолчанию)
Откройте Controllers\StudentController.cs, вы увидите созданную переменную, инициализирующую объект контекста базы данных:
Действие Index собирает список студентов из свойства Students из экземпляра контекста базы данных:
Автоматическое scaffolding было создано для множества Student . Для настройки заголовков и последовательности колонок откройте Views\Student\Index.cshtml и замените код на:
Запустите сайт, нажмите на вкладку Students.
Закройте браузер. В Solution Explorer выберите проект ContosoUniversity. Нажмите Show all Files, Refresh и затем разверните папку App_Data.
Два раза щелкните на School.sdf для открытия Server Explorer, и Tables.
Note если у вас возникает ошибка после того, как вы два раза щелкаете на School.sdf, убедитесь, что вы установили Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0. Если все установлено, перезапустите Visual Studio.
Для каждой таблицы есть свое множество сущностей + одна дополнительная таблица. EdmMetadata используется для определения Entity Framework, когда случилась разсинхронизация модели и базы.
Щелкните на одной из таблиц и Show Table Data чтобы увидеть загруженные классом SchoolInitializer данные.
Закройте подключение, иначе может возникнуть проблема с запуском приложения.
Соглашения
Количество кода, нужное для создания Entity Framework базы, минимально из-за использования (conventions) Entity Framework. Некоторые из них уже были упомянуты:
- Форма множественного числа имен классов сущностей используется в качестве имен таблиц.
- Имена свойств сущностей используется в качестве имен столбцов.
- Свойства сущностей с именами ID или classname ID распознаются как первичные ключи.
- Entity Framework подключается к базе, отыскав строку подключения с таким же именем, как и класс контекста (в данном случае SchoolContext ).
Вы создали простое приложение с использованием Entity Framework и SQL Server Compact для хранения и отображения данных. Далее мы научимся совершать простые CRUD (create, read, update, delete) операции.
The following topics will be covered in this tutorial:
- Creating a MySQL database on Azure
- Creating an MVC application using Visual Studio 2013 MVC template
- Configuring EntityFramework to work with a MySQL database provider
- Running the application to verify the results
Подключение и создание базы данных в Entity Framework Core
Для взаимодействия с MS SQL Server через Entity Framework необходим пакет Microsoft.EntityFrameworkCore.SqlServer . По умолчанию он отсутствует в проекте, поэтому его надо добавить, например, через пакетный менеджер Nuget:
Далее добавим в проект класс модели, с которой мы будем работать. По умолчанию в проекте уже есть предназначенная для моделей папка Models. Определим в этой папке определим новый класс User:
Эта модель представляет те объекты, которые будут храниться в базе данных.
Чтобы взаимодействовать с базой данных через Entity Framework нам нужен контекст данных - класс, унаследованный от класса Microsoft.EntityFrameworkCore.DbContext . Поэтому добавим в папку Models новый класс, который назовем ApplicationContext (название класса контекста произвольное):
Свойство DbSet представляет собой коллекцию объектов, которая сопоставляется с определенной таблицей в базе данных. При этом по умолчанию название свойства должно соответствовать множественному числу названию модели в соответствии с правилами английского языка. То есть User - название класса модели представляет единственное число, а Users - множественное число.
Через параметр options в конструктор контекста данных будут передаваться настройки контекста.
В конструкторе с помощью вызова Database.EnsureCreated() по определению моделей будет создаваться база данных (если она отсутствует).
Чтобы подключаться к базе данных, нам надо задать параметры подключения. Для этого изменим файл appsettings.json , добавив в него определение строки подключения:
В данном случае мы будем использовать упрощенный движок базы данных LocalDB, который представляет легковесную версию SQL Server Express, предназначенную специально для разработки приложений.
И последним шагом в настройке проекта является изменение файла Startup.cs . В нем нам надо изменить метод ConfigureServices() :
Добавление контекста данных в виде сервиса позволит затем получать его в конструкторе контроллера через механизм внедрения зависимостей.
Creating a custom EntityFramework initializer for ApplicationDbContext
The MySQL provider that is featured in this tutorial does not currently support Entity Framework migrations, so you will need to use model initializers in order to connect to the database. Because this tutorial is using a MySQL instance on Azure, you will need to create a custom Entity Framework initializer.
This step is not required if you are connecting to a SQL Server instance on Azure or if you are using a database that is hosted on premises.
To create a custom Entity Framework initializer for MySQL, use the following steps:
Add a new class file named MySqlInitializer.cs to the project, and replace it's contents with the following code:
Open the IdentityModels.cs file for your project, which is located in the Models directory, and replace it's contents with the following:
Running the application and verifying the database
Once you have completed the steps in the preceding sections, you should test your database. To do so, use the following steps:
Press Ctrl + F5 to build and run the web application.
Click the Register tab on the top of the page:
[Click the following image to expand it. ]
Enter a new user name and password, and then click Register:
[Click the following image to expand it. ]
[Click the following image to expand it. ]
Installing MySQL Workbench tool to verify the data
Install the MySQL Workbench tool from the MySQL downloads page
In the installation wizard: Feature Selection tab, select MySQL Workbench under applications section.
Launch the app and add a new connection using the connection string data from the Azure MySQL database you created at the beginning of this tutorial.
[Click the following image to expand it. ]
Inspect the aspnetusers table for instance to check for the entries as you register new users.
[Click the following image to expand it. ]
Итак, создадим первое приложение с использованием Entity Framework Core. Для этого создадим в Visual Studio 2022 новый проект по типу Console App :
На следующим шаге дадим проекту какое-нибудь название, например, HelloApp
Итак, Visual Studio создает проект с базовой примитивной структурой, где можно выделить собственно файл логики приложения - файл Program.cs . И чтобы начать работать с EntityFramework Core, нам необходимо вначале добавить в проект пакет EntityFramework Core. Для этого перейдем в проекте к пакетному менеджеру NuGet.
Однако здесь мы ищем не общий пакет для Entity Framework Core, а пакет для конкретной СУБД. Так, в данном случае мы будем использовать SQLite в качестве СУБД, поэтому нам надо искать пакет Microsoft.EntityFrameworkCore.Sqlite :
В качестве альтернативы для добавления пакетов можно использовать Package Manager Console . Для этого в меню Visual Studio перейдем к пункту Tools -> NuGet Package Manager -> Package Manager Console
В открывшемся внизу в Visual Studio окне Package Manager Console введем команду:
Итак, необходимые пакеты добавлены. Теперь мы можем их использовать.
Далее нам надо определить модель, которая будет описывать данные. Пусть наше приложение будет посвящено работе с пользователями. Поэтому добавим в проект новый класс User:
Это обычный класс, который содержит несколько свойств. Каждое свойство будет сопоставляться с отдельным столбцом в таблице из бд.
Надо отметить, что Entity Framework требует определения ключа элемента для создания первичного ключа в таблице в бд. По умолчанию при генерации бд EF в качестве первичных ключей будет рассматривать свойства с именами Id или [Имя_класса]Id (то есть UserId).
Взаимодействие с базой данных в Entity Framework Core происходит посредством специального класса - контекста данных. Поэтому добавим в наш проект новый класс, который назовем ApplicationContext и который будет иметь следующий код:
Основу функциональности Entity Framework Core для работы с MS SQL Server составляют классы, которые располагаются в пространстве имен Microsoft.EntityFrameworkCore . Среди всего набора классов этого пространства имен следует выделить следующие:
DbContext : определяет контекст данных, используемый для взаимодействия с базой данных
DbSet/DbSet : представляет набор объектов, которые хранятся в базе данных
DbContextOptionsBuilder : устанавливает параметры подключения
Для работы приложения с базой данной через Entity Framework необходим контекст данных - класс производный от DbContext . В данном случае таким контекстом является класс ApplicationContext.
И также в классе определено одно свойство Users, которое будет хранить набор объектов User. В классе контекста данных набор объектов представляет класс DbSet . Через это свойство будет осуществляться связь с таблицей, где будут храниться данные объектов User.
Причем этому свойству присваивается начальное значение - результат метода Set в виде объекта DbSet . В реальности в функциональном плане в этой инициализации мало смысла, она никак не повляет на работу свойства,поскольку все свойства контекста, которые представляют объект DbSet, инициализируются автоматически при создании объкта контекста. Однако поскольку тип DbSet - ссылочный тип, явная инициализация свойств ссылочных типов позволяет нам обойти предупреждения статического анализа для данных ссылочных типов, которые не инициализированны и при этом не допускают значение null .
В качестве альтернативы можно было бы использовать выражение null!
Кроме того, для настройки подключения нам надо переопределить метод OnConfiguring . Передаваемый в него параметр класса DbContextOptionsBuilder с помощью метода UseSqlite позволяет настроить строку подключения для соединения с базой данных SQLite.
В качестве параметра в метод передается строка подключения, которая в данном случае имеет только один параметр - Data Source . Он определяет файл базы данных - в данном случае "helloapp.db".
И также стоит отметить, что по умолчанию у нас нет базы данных. Поэтому в конструкторе класса контекста определен вызов метода Database.EnsureCreated() , который при создании контекста автоматически проверит наличие базы данных и, если она отсуствует, создаст ее.
Теперь определим сам код программы, который будет взаимодействовать с созданной БД. Для этого изменим файл Program.cs следующим образом:
Так как класс ApplicationContext через базовый класс DbContext реализует интерфейс IDisposable , то для работы с ApplicationContext с автоматическим закрытием данного объекта мы можем использовать конструкцию using .
В конструкции using создаются два объекта User и добавляются в базу данных. Для их сохранения нам достаточно использовать метод Add :
В результате после запуска программа выведет на консоль:
Поскольку в классе контекста при установке строки подключения к Sqlite указан относительный путь, то после выполнения программы мы можем найти файл базы данных вв папке скомпилированного приложения:
С помощью специальных программ, например, DB Browser for SQLite мы можем посмотреть ее содержимое:
Таким образом, Entity Framework Core обеспечивает простое и удобное управление объектами из базы данных. При том в данном случае нам не надо даже создавать базу данных и определять в ней таблицы. Entity Framework все сделает за нас на основе определения класса контекста данных и классов моделей. И если база данных уже имеется, то EF не будет повторно создавать ее.
Install the MySQL provider for EntityFramework
In order for EntityFramework to connect to MySQL database, you need to install a MySQL provider. To do so, open the Package Manager Console and type "Install-Package MySql.Data.Entity -Pre", and then press Enter.
This is a pre-release version of the assembly, and as such it may contain bugs. You should not use a pre-release version of the provider in production.
[Click the following image to expand it.]
Update the Entity Framework assembly for your project
The MVC application that was created from the Visual Studio 2013 template contains a reference to the EntityFramework 6.0.0 package, but there have been updates to that assembly since its release which contain significant performance improvements. In order to use these latest updates in your application, use the following steps.
Open your MVC project in Visual Studio.
Click Tools, then click NuGet Package Manager, and then click Package Manager Console:
[Click the following image to expand it. ]
The Package Manager Console will appear in the bottom section of Visual Studio. Type "Update-Package EntityFramework" and press Enter:
[Click the following image to expand it. ]
Making project configuration changes to the Web.config file for your application
In this section you will configure the Entity Framework to use the MySQL provider that you just installed, register the MySQL provider factory, and add your connection string from Azure.
The following examples contain a specific assembly version for MySql.Data.dll. If the assembly version changes, you will need to modify the appropriate configuration settings with the correct version.
Open the Web.config file for your project in Visual Studio 2013.
Locate the following configuration settings, which define the default database provider and factory for the Entity Framework:
Replace those configuration settings with the following, which will configure the Entity Framework to use the MySQL provider:
Locate the section and replace it with the following code, which will define the connection string for your MySQL database that is hosted on Azure (note that providerName value has also been changed from the original):
Configure EntityFramework to work with a MySQL database
Creating an MVC application project
To complete the steps in this section of the tutorial, you will first need to install Visual Studio Express 2013 for Web or Visual Studio 2013. Once Visual Studio has been installed, use the following steps to create a new MVC application project:
Open Visual Studio 2103.
Click New Project from the Start page, or you can click the File menu and then New Project:
[Click the following image to expand it. ]
[Click the following image to expand it. ]
[Click the following image to expand it. ]
Creating a MySQL database instance on Azure
In the Choose an Add-on wizard, select ClearDB MySQL Database, and then click the Next arrow at the bottom of the frame:
[Click the following image to expand it. ]
Keep the default Free plan, change the NAME to IdentityMySQLDatabase, select the region that is nearest to you, and then click the Next arrow at the bottom of the frame:
[Click the following image to expand it. ]
Click the PURCHASE checkmark to complete the database creation.
[Click the following image to expand it. ]
After your database has been created, you can manage it from the ADD-ONS tab in the management portal. To retrieve the connection information for your database, click CONNECTION INFO at the bottom of the page:
[Click the following image to expand it. ]
Copy the connection string by clicking on the copy button by the CONNECTIONSTRING field and save it; you will use this information later in this tutorial for your MVC application:
[Click the following image to expand it. ]
Adding custom MigrationHistory context
Entity Framework Code First uses a MigrationHistory table to keep track of model changes and to ensure the consistency between the database schema and conceptual schema. However, this table does not work for MySQL by default because the primary key is too large. To remedy this situation, you will need to shrink the key size for that table. To do so, use the following steps:
The schema information for this table is captured in a HistoryContext, which can be modified as any other DbContext. To do so, add a new class file named MySqlHistoryContext.cs to the project, and replace its contents with the following code:
Next you will need to configure Entity Framework to use the modified HistoryContext, rather than default one. This can be done by leveraging code-based configuration features. To do so, add new class file named MySqlConfiguration.cs to your project and replace its contents with:
Читайте также: