Использование Model-First

185

Как было сказано ранее, подход к проектированию Model-First позволяет создать сначала графическую модель с помощью дизайнера EDM среды Visual Studio, а уже затем на ее основе создать базу данных. Подробный пример использования этой модели был показан в статье “Простое приложение с использованием Entity Framework”. В этой статье мы расширим проект, который использовали при описании подхода Code-First, фактически вы сможете сравнить, как выполняется одна и та же задача в этих подходах.

Определение модели базы данных

Итак мы расширим проект, который создали в предыдущей статье, использовав подход Model-First. Как вы уже знаете, наша модель данных довольно простая и содержит две связанные таблицы Customer и Order, описывающие покупателя в интернет-магазине и его заказы. Для создания графической модели данных используйте следующие шаги:

  1. Если вы еще не создали проект веб-приложения, то создайте его, используя шаблон пустого приложения ASP.NET (этот процесс со скриншотами подробно описан в предыдущей статье) и добавьте в проект веб-форму Default.aspx с такой же разметкой, как и ранее. Если вы проработали примеры из предыдущей статьи, то удалите код внутри обработчика Page_Load в файле отделенного кода, в котором мы показывали работу подхода Code_First.

  2. Добавьте новый проект библиотеки классов в ваше решение. Для этого в окне Solution Explorer щелкните правой кнопкой мыши по имени решения и выберите в контекстном меню команду Add --> New Project. Выберите шаблон библиотеки классов (Class Library), назовите его ModelFirst и нажмите кнопку Add.

  3. Щелкните по имени созданного проекта правой кнопкой мыши в окне Solution Explorer и выберите в контекстном меню команду Add --> New Item. В открывшемся диалоговом окне найдите шаблон ADO NET Entity Data Model на вкладке Data, задайте ему произвольное имя и щелкните по кнопке Add.

    Добавление модели edmx
  4. После этого в открывшемся окне Entity Data Model Wizard нужно выбрать подход для работы с Entity Framework. Выберите вариант Empty EF Designer Model который предполагает создание пустой модели EDMX, что подразумевает под собой использование подхода Model-First.

  5. После этого нажмите кнопку Finish. Вы увидите что мастер Entity Data Model Wizard создаст пустую модель в вашем проекте. Структура решения в данной точке должна выглядеть следующим образом:

    Структура решения после добавления файла edmx
  6. Перетащите с панели Toolbox элемент Entity в область графического редактора EDM. Панель Toolbox по умолчанию находится в левом верхнем углу Visual Studio 2012, под панелью задач. Если эта панель скрыта, ее можно открыть с помощью команды меню View --> ToolBox. Переименуйте созданную таблицу в Customer и добавьте в нее несколько столбцов (с помощью команды из контекстного меню Add New --> Scalar Property). Добавьте таким же образом таблицу Order, результирующий вид графического редактора EDM на данном шаге должен иметь вид:

    Добавление двух таблиц в графический редактор EDM
  7. Теперь нам нужно настроить типы столбцов и их ограничения. Напомню, в Code-First это делалось в коде модели с помощью атрибутов метаданных или Fluent API. Model-First облегчает указание этих деталей, вы просто должны выделить нужное поле таблицы в графическом редакторе и изменить его свойства в окне Properties (открывается из меню View --> Properties Window). Например, для поля Name таблицы Customer мы добавляли ограничение на длину и указывали отсутствие в нем поддержки значений NULL. В этом случае, окно Properties для этого поля будет выглядеть следующим образом:

    Вид окна Properties для поля Name

    Таким образом измените тип поля Age на Int32, тип и максимальный размер поля Photo на binary и max соответственно, укажите ограничение в 100 символов для поля Email. Измените в таблице Order тип поля Quantity на Int32, а PurchaseDate на DateTime.

  8. После этого нам нужно будет добавить связь между этими таблицами. Это можно сделать с помощью элемента Association с панели Toolbox или щелкнув правой кнопкой мыши по таблице Customer и выбрав в контекстном меню Add New --> Association. Давайте используем второй подход. При этом откроется модальное окно Add Association:

    Добавление связи между таблицами

    Обратите внимание, что диалоговое окно автоматически заполняет необходимую информацию. Это происходит потому, что вы добавили всего две таблицы, и Entity Framework предполагает отношение один-ко-многим между таблицей покупателей и их заказами. В некоторых случаях, необходимо изменить содержание этого диалогового окна, но часто, IDE автоматически определит правильные настройки для вас.

  9. Щелкните по кнопке ОК. Visual Studio создаст отношение один-ко-многим (one-to-many) между таблицами. Кроме того, она автоматически сгенерирует навигационное свойство CustomerCustomerId, являющееся внешним ключом таблицы Order. К этому моменту ваша модель будет завершена, и она должна выглядеть так, как показано на рисунке:

    Конечная структура модели в графическом редакторе
  10. Теперь вам нужно будет сгенерировать базу данных из этой графической модели. Для этого щелкните правой кнопкой мыши в свободном месте графического редактора и выберите из контекстного меню команду Generate Database From Model. В открывшемся диалоговом окне вам нужно будет щелкнуть по кнопке New Connection, подключиться к SQL Server, задать имя базы данных (я задал имя MyShop1, в предыдущей статье мы создали базу данных MyShop, при рассмотрении подхода Code-First) и сгенерировать базу данных. Более детально эти шаги описывались в статье “Простое приложение с использованием Entity Framework” ранее.

  11. После этого постройте решение командой 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 используя графический интерфейс веб-сайта.

Пройди тесты
Лучший чат для C# программистов