Поиск на сайте: Расширенный поиск


Новые программы oszone.net Читать ленту новостей RSS
CheckBootSpeed - это диагностический пакет на основе скриптов PowerShell, создающий отчет о скорости загрузки Windows 7 ...
Вы когда-нибудь хотели создать установочный диск Windows, который бы автоматически установил систему, не задавая вопросо...
Если после установки Windows XP у вас перестала загружаться Windows Vista или Windows 7, вам необходимо восстановить заг...
Программа подготовки документов и ведения учетных и отчетных данных по командировкам. Используются формы, утвержденные п...
Red Button – это мощная утилита для оптимизации и очистки всех актуальных клиентских версий операционной системы Windows...
OSzone.net Microsoft Разработка приложений .NET Framework Раскрытие стратегий в Entity Framework: рабочий процесс создания модели RSS

Раскрытие стратегий в Entity Framework: рабочий процесс создания модели

Текущий рейтинг: 4.2 (проголосовало 5)
 Посетителей: 3012 | Просмотров: 5246 (сегодня 0)  Шрифт: - +

При разработке приложения приходится принимать гораздо больше проектировочных решений, но эти вопросы относятся к числу наиболее часто задаваемых разработчиками, приступающими к внедрению Entity Framework в существующие или новые приложения.

Здесь я поясню рабочий процесс создания концептуальной модели, а в следующих двух статьях мы рассмотрим остальные три вопроса.

Три варианта создания концептуальной модели

Entity Framework опирается на концептуальную модель сущностей вашей предметной области, называемую Entity Data Model (EDM), и выбор того, как создавать эту модель, является самым первым шагом. Вы можете выбрать один из трех рабочих процессов:

  • Database First — вы начинаете с существующей базы данных и используете мастер для генерации на ее основе концептуальной модели;
  • Model First — вы начинаете с нуля. С помощью визуального дизайнера (EDM Designer) проектируется EDM, а затем на ее основе генерируется схема базы данных;
  • Code First — вы начинаете с классов, которые описывают вашу концептуальную модель. В этом случае визуальная модель отсутствует.

Database First: начинаем с существующей базы данных

На первой итерации Entity Framework у нас не было всех упомянутых вариантов. Единственный способ создания модели заключался в обратном проектировании существующей базы данных для преобразования в EDM, которое мы назвали моделированием Database First («сначала база данных») (рис. 1).

*
Увеличить

Рис. 1. При использовании Database First модель генерируется на основе существующей базы данных

На самом деле, вероятно, вы не раз видели такое. Вы открываете EDM Wizard, указываете ему существующую базу данных, выбираете, какие таблицы, представления, хранимые процедуры и пользовательские функции должны быть представлены в модели, потом щелкаете кнопку Finish. И тут же рождается модель. При подходе Database First модель начинает свою жизнь как виртуальное отражение базы данных (или ее подмножества, выбранного вами). Даже не прикладывая больше никаких усилий, разработчики все равно получат выигрыш от Entity Framework. Вы можете писать строго типизированные запросы к этой модели, и Entity Framework будет выполнять запросы за вас, материализуя строго типизированные объекты из набора результатов. Затем, когда вы работаете с результатами, Entity Framework отслеживает изменения и позволяет сохранять их в базе данных простым вызовом команды SaveChanges.

Для некоторых разработчиков больше ничего от Entity Framework и не понадобится, но в таком случае они упускают одно из самых больших преимуществ создания модели — возможность сделать ее более похожей на предметную область (классы и их связи, определенные в приложении), чем это позволяет база данных. Настройка модели — крайне важная особенность EDM, о которой не знают многие разработчики и никак ею не пользуются. Вы можете вводить в эту модель иерархии наследования, изменять структуру сущностей, объединять/разделять их и т. д.

При подходе Database First вы можете получить лучшее из двух миров: использовать существующую базу данных для очень быстрого создания модели, а затем изменять эту модель, чтобы она точнее отражала предметную область вашего приложения.

Model First: начинаем с визуальной модели

У вас не всегда будет в наличии база данных. Подход Model First позволяет проектировать модель в дизайнере и создать на основе этой модели схему вашей базы данных. Вы можете создавать свои сущности и их свойства, определять отношения и их ограничения, а также формировать иерархии наследовании прямо в дизайнере. Вы даже можете указать, какие свойства станут идентификационными ключами (identity keys) и должна ли база данных сама генерировать их значения (рис. 2).

*
Увеличить

Рис. 2. При использовании Model First вы проектируете модель, применяемую для генерации схемы базы данных

Функция Create Database from Model в EDM Designer на самом деле не создает базу данных — она генерирует SQL-код, при выполнении которого будет определена схема базы данных. Этот SQL-код имеет формат Data Definition Language (DDL).

Вы должны понимать несколько не вполне очевидных вещей. Поддержка Model First введена вVisual Studio 2010 и Microsoft .NET Framework 4. Вы не найдете Create Database в Visual Studio 2008. Кроме того, поскольку это новая функция, вам потребуется обновить используемый провайдер ADO.NET Data (например, System.Data.Sql) до версии, где эта функция уже поддерживается. Провайдер Microsoft SQL Server был обновлен при выпуске .NET 4; также были обновлены некоторые сторонние провайдеры.

Будьте готовы к тому, что в случае Model First инкрементальные обновления схемы вашей базы данных по умолчанию не осуществляются. При использовании соответствующей функции вы получите совершенно новый DDL-скрипт, который удалит и заново создаст все объекты базы данных. Модифицировать схему базы данных, не перезаписывая ее полностью, помогут внешние инструменты. В ином случае вы наверняка захотите либо заранее создавать резервную копию данных, либо написать скрипт, регенерирующий ваши тестовые данные при каждой модификации модели и повторном создании схемы базы данных.

Visual Studio предоставляет точку расширения в процессе генерации базы данных, которую можно использовать с помощью Entity Designer Database Generation Power Pack от Microsoft. Данный пакет можно скачать из Visual Studio 2010 Extension Manager или по ссылке visualstudiogallery.com. Это расширение позволяет не только вносить инкрементальные изменения в базу данных при использовании подхода Model First, но и изменять исходное сопоставление наследования Table Per Hierarchy или даже создавать собственные правила генерации DDL.

Code First: начинаем с кода и отказываемся от физической модели

При подходах Database First и Model First вы в конечном счете получаете физическое представление вашей EDM вместе с дополнительными метаданными. Исходный формат этой модели — XML. Он хранится в файле с расширением .edmx, и вы можете работать с ним в EDM Designer или как с чистым XML-кодом. В период выполнения Entity Framework считывает этот XML и создает представление модели в памяти, используя специализированные классы, представляющие метаданные — сущности, отношения и др. Исполняющая среда Entity Framework работает с этими объектами, а не с самим XML-файлом. Эти метаданные особенно важны, когда Entity Framework нужно преобразовывать запросы к модели в запросы к базе данных и получаемые наборы результатов в экземпляры сущностей, а также создавать команды базы данных для операций вставки, обновления и удаления. Visual Studio сгенерирует классы вашей предметной области из XML для последующего использования в приложении.

TГруппа Entity Framework предложила способ создания необходимых объектов метаданных в период выполнения без физического EDMX-файла. В этом и заключается мощь третьего рабочего процесса создания модели для Entity Framework, который назвали Code First. При Code First вместо EDM вы создаете классы своей предметной области — так, как вы делали бы это в любых других .NET-разработках. В период выполнения Entity Framework будет анализировать эти классы и, используя набор соглашений по умолчанию, формировать в памяти модель, с которой сможет работать исполняющая среда Entity Framework. Поскольку ваши классы не всегда будут естественным образом предоставлять информацию, необходимую Entity Framework для создания этой модели, вы можете создать дополнительную конфигурацию (с помощью декларативных атрибутов и/или аннотаций данных либо программно с помощью текучего [fluent] API) для более детального описания модели, переопределяя упомянутые выше соглашения. Вы можете использовать конфигурацию для широкого спектра задач, связанных с моделью, — от идентификации основных ключей, не соответствующих соглашениям Code First, до тонкой настройки отношений или даже определения того, как следует представлять иерархию наследования.

Как и в Model First, в Code First по умолчанию предполагается, что у вас нет существующей базы данных, и предоставляется возможность создать базу данных на основе логически построенной модели. Но в отличие от Model First вы можете создать как файл базы данных, так и схему. В Code First у вас по-прежнему нет способа сохранить информацию базы данных, если вы модифицируете модель и заново генерируете базу данных. Однако Code First позволяет распознавать различия между моделью и базой данных, а также инициализировать базу с помощью определенных данных, используя инициализаторы базы данных.

Вы также можете использовать Code First с существующей базой данных. Если имена ваших класса и свойств не соответствуют содержимому базы данных, можно обойти эту проблему, добавив аннотации данных или конфигурацию через текучий API. На рис. 3 показан класс с атрибутами, которые заставляют Code First обеспечивать сопоставление с корректными именами таблицы и свойств, даже если имена класса и его полей не имеют точного совпадения с ними.

Рис. 3. Класс с атрибутами Code First, обеспечивающими корректное сопоставление этого класса с существующей таблицей

[Table("SalesOrderDetail", SchemaName="SalesLT")]
  public partial class Detail
  {
    // Скалярные свойства

    [Column(Name = "SalesOrderID")]
    public int OrderId { get; set; }
    [Column(Name = "SalesOrderDetailID")]
    public int DetailId { get; set; }
    public short OrderQty { get; set; }
    public int ProductId { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal UnitPriceDiscount { get; set; }

    public decimal LineTotal { get; set; }
    public System.DateTime ModifiedDate { get; set; }

    // Навигационные свойства
    public virtual Product Product { get; set; }
    public virtual Order Order { get; set; }
  }

Дерево решений

Благодаря эволюционному развитию Entity Framework теперь поддерживает разнообразные стили разработки, но это требует от нас понимания возможных вариантов, чтобы делать правильный выбор в той или иной ситуации. Если вы предпочитаете UI для модели, используйте EDM Designer независимо от того, приступаете вы к созданию модели на основе существующей базы данных или выбираете подход Model First. Если вы делаете все программным способом и не хотите зависимости от EDMX-файла или визуального дизайнера, ваш выбор — Code First (рис. 4).

*
Увеличить

Рис. 4. Дерево решений

Prefer Visual Designer?Предпочитаете визуальный дизайнер?
Code FirstCode First
NoНет
YesДа
Existing Database?Существующая база данных?
Model FirstModel First
Database FirstDatabase First

Заключение

Какую бы методику моделирования вы ни выбрали — Database First, Model First или Code First, после создания модели вы не заметите никакой разницы, когда начнете выдавать запросы, взаимодействовать с сущностями и сохранять их, используя исполняющую среду Entity Framework через классы модели. Кроме того, можно начать с одного рабочего процесса, а затем переключиться на другой. Вы можете создать классы Code First из EDMX с помощью шаблона DbContext Code Generation. И даже, хотя это не так-то просто, создать EDMX из классов Code First.

Я предоставила высокоуровневый обзор различных вариантов и того, в каких случаях один вариант предпочтительнее другого. Надеюсь, мне удалось снять покров тайны с некоторых методик моделирования.

В последующих статьях мы обсудим другие важные решения, которые вам придется принимать при разработке приложений Entity Framework: выбор стратегии генерации кода для EntityObjects или POCO, способы загрузки релевантных данных (интенсивная, отложенная или явная) и написание запросов с применением LINQ to Entities или Entity SQL.

Автор: Джули Лерман  •  Иcточник: MSDN Magazine  •  Опубликована: 29.11.2011
Нашли ошибку в тексте? Сообщите о ней автору: выделите мышкой и нажмите CTRL + ENTER
Теги:   Entity Framework.


Оценить статью:
Вверх
Комментарии посетителей
Комментарии отключены. С вопросами по статьям обращайтесь в форум.