Использование Model-First
185Работа с базами данных в .NET Framework --- Entity Framework 6 --- Использование Model-First
Как было сказано ранее, подход к проектированию Model-First позволяет создать сначала графическую модель с помощью дизайнера EDM среды Visual Studio, а уже затем на ее основе создать базу данных. Подробный пример использования этой модели был показан в статье “Простое приложение с использованием Entity Framework”. В этой статье мы расширим проект, который использовали при описании подхода Code-First, фактически вы сможете сравнить, как выполняется одна и та же задача в этих подходах.
Определение модели базы данных
Итак мы расширим проект, который создали в предыдущей статье, использовав подход Model-First. Как вы уже знаете, наша модель данных довольно простая и содержит две связанные таблицы Customer и Order, описывающие покупателя в интернет-магазине и его заказы. Для создания графической модели данных используйте следующие шаги:
Если вы еще не создали проект веб-приложения, то создайте его, используя шаблон пустого приложения ASP.NET (этот процесс со скриншотами подробно описан в предыдущей статье) и добавьте в проект веб-форму Default.aspx с такой же разметкой, как и ранее. Если вы проработали примеры из предыдущей статьи, то удалите код внутри обработчика Page_Load в файле отделенного кода, в котором мы показывали работу подхода Code_First.
Добавьте новый проект библиотеки классов в ваше решение. Для этого в окне Solution Explorer щелкните правой кнопкой мыши по имени решения и выберите в контекстном меню команду Add --> New Project. Выберите шаблон библиотеки классов (Class Library), назовите его ModelFirst и нажмите кнопку Add.
Щелкните по имени созданного проекта правой кнопкой мыши в окне Solution Explorer и выберите в контекстном меню команду Add --> New Item. В открывшемся диалоговом окне найдите шаблон ADO NET Entity Data Model на вкладке Data, задайте ему произвольное имя и щелкните по кнопке Add.
После этого в открывшемся окне Entity Data Model Wizard нужно выбрать подход для работы с Entity Framework. Выберите вариант Empty EF Designer Model который предполагает создание пустой модели EDMX, что подразумевает под собой использование подхода Model-First.
После этого нажмите кнопку Finish. Вы увидите что мастер Entity Data Model Wizard создаст пустую модель в вашем проекте. Структура решения в данной точке должна выглядеть следующим образом:
Перетащите с панели Toolbox элемент Entity в область графического редактора EDM. Панель Toolbox по умолчанию находится в левом верхнем углу Visual Studio 2012, под панелью задач. Если эта панель скрыта, ее можно открыть с помощью команды меню View --> ToolBox. Переименуйте созданную таблицу в Customer и добавьте в нее несколько столбцов (с помощью команды из контекстного меню Add New --> Scalar Property). Добавьте таким же образом таблицу Order, результирующий вид графического редактора EDM на данном шаге должен иметь вид:
Теперь нам нужно настроить типы столбцов и их ограничения. Напомню, в Code-First это делалось в коде модели с помощью атрибутов метаданных или Fluent API. Model-First облегчает указание этих деталей, вы просто должны выделить нужное поле таблицы в графическом редакторе и изменить его свойства в окне Properties (открывается из меню View --> Properties Window). Например, для поля Name таблицы Customer мы добавляли ограничение на длину и указывали отсутствие в нем поддержки значений NULL. В этом случае, окно Properties для этого поля будет выглядеть следующим образом:
Таким образом измените тип поля Age на Int32, тип и максимальный размер поля Photo на binary и max соответственно, укажите ограничение в 100 символов для поля Email. Измените в таблице Order тип поля Quantity на Int32, а PurchaseDate на DateTime.
После этого нам нужно будет добавить связь между этими таблицами. Это можно сделать с помощью элемента Association с панели Toolbox или щелкнув правой кнопкой мыши по таблице Customer и выбрав в контекстном меню Add New --> Association. Давайте используем второй подход. При этом откроется модальное окно Add Association:
Обратите внимание, что диалоговое окно автоматически заполняет необходимую информацию. Это происходит потому, что вы добавили всего две таблицы, и Entity Framework предполагает отношение один-ко-многим между таблицей покупателей и их заказами. В некоторых случаях, необходимо изменить содержание этого диалогового окна, но часто, IDE автоматически определит правильные настройки для вас.
Щелкните по кнопке ОК. Visual Studio создаст отношение один-ко-многим (one-to-many) между таблицами. Кроме того, она автоматически сгенерирует навигационное свойство CustomerCustomerId, являющееся внешним ключом таблицы Order. К этому моменту ваша модель будет завершена, и она должна выглядеть так, как показано на рисунке:
Теперь вам нужно будет сгенерировать базу данных из этой графической модели. Для этого щелкните правой кнопкой мыши в свободном месте графического редактора и выберите из контекстного меню команду Generate Database From Model. В открывшемся диалоговом окне вам нужно будет щелкнуть по кнопке New Connection, подключиться к SQL Server, задать имя базы данных (я задал имя MyShop1, в предыдущей статье мы создали базу данных MyShop, при рассмотрении подхода Code-First) и сгенерировать базу данных. Более детально эти шаги описывались в статье “Простое приложение с использованием Entity Framework” ранее.
После этого постройте решение командой Build --> Solution, чтобы Visual Studio скомпилировало наше приложение и автоматически сгенерировало класс контекста для кода доступа к базе данных.
Работа с данными
Как вы заметили, в отличие от подхода Code-First, где все необходимо создавать вручную, подход Model-First использует полную автоматизацию для создания кода модели данных и генерации базы данных. Он даже автоматически создает класс контекста данных и автоматически добавляет поддержку Entity Framework 6 в ваше приложение, не используя ручной установки с помощью пакетов NuGet, как мы делали в Code-First.
Теперь мы можем непосредственно работать с базой данных используя Entity Framework. Для этого сначала добавьте ссылку на проект ModelFirst в проект веб-приложения и добавьте следующий код в файл веб-формы Default.aspx.cs:
using System;
using System.Web;
using System.Web.ModelBinding;
using System.IO;
// Обратите внимание, что мы удалили ссылку на проект CodeFirst,
// созданный ранее и добавили ссылку на проект ModelFirst
using ModelFirst;
namespace ProfessorWeb.EntityFramework
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Page.IsPostBack)
{
Customer customer = new Customer();
// Получить данные из формы с помощью средств
// привязки моделей ASP.NET
IValueProvider provider =
new FormValueProvider(ModelBindingExecutionContext);
if (TryUpdateModel<Customer>(customer, provider))
{
// Загрузить фото профиля с помощью средств .NET
HttpPostedFile photo = Request.Files["photo"];
if (photo != null)
{
BinaryReader b = new BinaryReader(photo.InputStream);
customer.Photo = b.ReadBytes((int)photo.InputStream.Length);
}
// В этой точке непосредственно начинается работа с Entity Framework
// Создать объект контекста
Model1Container context = new Model1Container();
// Вставить данные в таблицу Customers с помощью LINQ
context.CustomerSet.Add(customer);
// Сохранить изменения в БД
context.SaveChanges();
}
}
}
}
}
Как видно из этого примера, код не особо отличается от того, который мы использовали в Code-First. Изменилось имя класса контекста, здесь оно сгенерировано автоматически (Model1Container), в Code-First мы явно его задавали (SampleContext). Также в автоматически сгенерированной модели свойство CustomerSet описывает таблицу Customer, в Code-First мы использовали имя Customers. Несмотря на небольшую разницу в названиях этих классов и свойств, код в примерах абсолютно одинаков, что при использовании подхода Code-First, что при использовании подхода Model-First. Это и является главной концепцией работы с Entity Framework – разрабатывать модель и создавать базу данных вы можете разными способами, но когда дело доходит до использования классов контекста для работы с данными, код является одинаковым и не зависит от подхода.
Чтобы этот пример заработал, нужно выполнить еще один маленький шаг. Нужно добавить строку подключения в конфигурационный файл приложения ASP.NET (при рассмотрении подхода Code-First этот шаг не требовался, т.к. мы явно указывали имя базы данных в конструкторе класса контекста SampleContext). Чтобы сделать это быстро, откройте файл App.Config в проекте ModelFirst и скопируйте секцию connectionStrings в файл Web.config веб-приложения.
После запуска этого проекта, вы сможете добавлять новых заказчиков в автоматически сгенерированную таблицу CustomerSet базы данных MyShop1 используя графический интерфейс веб-сайта.