Пояснительная записка Калинин Н.А. (1209681), страница 3
Текст из файла (страница 3)
При работе в режиме Code First концептуальная модель сопоставлена с моделью хранения в коде. Entity Framework может вывести концептуальную модель, основанную на типах объектов и дополнительных конфигурациях, которые можно задать. Метаданные сопоставления формируются во время выполнения на основе сочетания определений типов домена и дополнительной информации о конфигурации, которая указана в коде. Entity Framework при необходимости создает базу данных на основе метаданных.
При работе со средствами работы с моделью EDM концептуальная модель, модель хранения и сопоставление между ними выражены в схемах на основе XML и определены в файлах с именами с соответствующими расширениями.
Язык CSDL определяет концептуальную модель. Язык CSDL – это реализация модели EDM для платформы Entity Framework. Расширение файла – CSDL.
Язык SSDL определяет модель хранения данных, которая также называется логической моделью. Расширение файла – SSDL.
Язык MSL определяет сопоставление модели хранения и концептуальной модели. Расширение файла – MSL.
Модель хранения и сопоставления при необходимости могут быть изменены без изменения концептуальной модели, классов данных и кода приложения. Модели хранения зависят от поставщика, поэтому можно работать с согласованной концептуальной моделью через различные источники данных.
В Entity Framework файлы модели и сопоставления служат для выполнения операций создания, чтения, обновления и удаления, выполняемых над сущностями и связями концептуальной модели, в эквивалентные операции в источнике данных. Entity Framework поддерживает даже сопоставление сущностей в концептуальной модели с хранимыми процедурами в источнике данных. Для получения дополнительной информации см. Спецификации языка CSDL, SSDL и MSL.
Сопоставление объектов и данных
При использовании объектно–ориентированного программирования для взаимодействия с системами хранения данных возникают сложности. Безусловно, организация классов часто напоминает организацию таблиц реляционной базы данных, но такое соответствие неидеально. Несколько нормализованных таблиц часто соответствуют единственному классу, а связи между классами представлены не так, как связи между таблицами. Например, для представления клиенту заказа на продажу в классе Order может использоваться свойство, содержащее ссылку на экземпляр класса Customer, но строка таблицы Order базы данных содержит столбец внешнего ключа (или набор столбцов) со значением, которое соответствует первичному ключу в таблице Customer. Класс Customer может включать свойство с именем Orders, содержащее коллекцию экземпляров класса Order, но таблица Customer базы данных не содержит сравнимого столбца. В этом случае Entity Framework предоставляет разработчикам гибкость в представлении связей или более полные связи модели (такие, как в базе данных).
В существующих решениях была предпринята попытка устранить этот разрыв, часто называемый «несоответствием типов данных» (impedance mismatch), путем сопоставления с реляционными таблицами и столбцами только объектно-ориентированных классов и свойств. Вместо данного традиционного подхода в Entity Framework реляционные таблицы, столбцы и ограничения внешнего ключа логических моделей преобразуются в сущности и связи концептуальных моделей. Это позволяет достичь большей гибкости при определении объектов и оптимизации логической модели. С помощью инструментов EDM (модель данных с использованием сущностей) формируются расширяемые классы данных, основанные на концептуальной модели. Эти классы являются разделяемыми классами, которые могут быть расширены с помощью дополнительных членов, добавленных разработчиком. По умолчанию классы, сформированные для определенной концептуальной модели, являются производными от базовых классов, предоставляющих службы для материализации сущностей в виде объектов, а также для отслеживания и сохранения изменений. Разработчики могут использовать эти три класса для работы с сущностями и связями как с объектами, относящимися к ассоциациям. Разработчики смогут также настраивать классы, сформированные для концептуальной модели.
В большей степени, чем остальные решения объектно–реляционного сопоставления, Entity Framework направлен на то, чтобы давать приложениям возможность чтения и изменения данных, представленных в виде сущностей и связей в концептуальной модели. Entity Framework использует данные в модели и файлах сопоставления для преобразования запросов объектов к типам сущностей, представленным в концептуальной модели, в запросы, зависящие от источника данных. Результаты запросов преобразуются в объекты, которыми управляют Entity Framework. Платформа Entity Framework реализует следующие способы выполнения запросов к концептуальной модели и возврата объектов.
LINQ to Entities. Обеспечивает поддержку запросов LINQ для выполнения запросов к типам сущности, которые определены в концептуальной модели. Для получения дополнительной информации см. LINQ to Entities.
Entity SQL. Независимый от хранилища диалект SQL, который работает непосредственно с сущностями в концептуальной модели и поддерживает основные понятия EDM (модель данных с использованием сущностей). Entity SQL используется и с запросами объектов, и с запросами, выполняемыми с помощью поставщика EntityClient. Для получения дополнительной информации см. Общие сведения о языке Entity SQL.
Платформа Entity Framework включает в себя поставщик данных EntityClient. Поставщик управляет соединениями, переводит запросы сущностей в запросы, зависящие от источника данных, и возвращает модуль чтения данных, который используется Entity Framework для материализации данных сущности в виде объектов. Если материализация объектов не требуется, то поставщик EntityClient может также работать в качестве стандартного поставщика данных ADO.NET, позволяющий приложениям выполнять запросы Entity SQL и получать данные только для чтения, возвращаемые модулем чтения данных. Для получения дополнительной информации см. Поставщик EntityClient для платформы Entity Framework.
На рисунке 3.1 показана архитектура доступа к данным Entity Framework.
Рисунок 3. 1– Архитектура доступа к данным
Средства EDM (модель данных с использованием сущностей) могут сформировать класс, производный от System.Data.Objects.ObjectContext или System.Data.Entity.DbContext, который представляет контейнер сущностей в концептуальной модели. Контекст объекта предоставляет средства для отслеживания изменений и управления идентификаторами, параллелизмом и связями. Этот класс представляет также доступ к методу SaveChanges, который записывает результаты вставки, обновления и удаления данных в источник данных. Подобно запросам, эти изменения производятся либо командами, автоматически сформированными системой, либо хранимыми процедурами, указанными разработчиком.
Поставщик EntityClient расширяет модель поставщика ADO.NET путем доступа к данным в терминах сущностей и связей концептуальной модели. Выполняет запросы на языке Entity SQL. Entity SQL представляет базовый язык запросов, с помощью которого EntityClient обменивается данными с базой данных. Для получения дополнительной информации см. Поставщик EntityClient для платформы Entity Framework.
Приложение Entity Framework включает обновленный поставщик данных SqlClient, который поддерживает канонические деревья команд. Для получения дополнительной информации см. SqlClient для платформы Entity Framework.
Entity Framework представляет специальную объектно–ориентированную технологию на базе фреймворка .NET для работы с данными. Если традиционные средства ADO.NET позволяют создавать подключения, команды и прочие объекты для взаимодействия с базами данных, то Entity Framework представляет собой более высокий уровень абстракции, который позволяет абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища. Если на физическом уровне мы оперируем таблицами, индексами, первичными и внешними ключами, но на концептуальном уровне, который нам предлагает Entity Framework, мы уже работает с объектами.
Первая версия Entity Framework вышла еще в 2008 году и представляла очень ограниченную функциональность, базовую поддержку ORM (object–relational mapping – отображения данных на реальные объекты) и один единственный подход к взаимодействию с бд – Database First. С выходом версии 4.0 в 2010 году многое изменилось – с этого времени Entity Framework стал рекомендуемой технологией для доступа к данным, а в сам фреймворк были введены новые возможности взаимодействия с бд – подходы Model First и Code First.Дополнительные улучшения функционала последовали с выходом версии 5.0 в 2012 году. И наконец, в 2013 году был выпущен Entity Framework 6.0, обладающий возможностью асинхронного доступа к данным.
Центральной концепцией Entity Framework является понятие сущности или entity. Сущность представляет набор данных, ассоциированных с определенным объектом. Поэтому данная технология предполагает работу не с таблицами, а с объектами и их наборами.
Любая сущность, как и любой объект из реального мира, обладает рядом свойств. Например, если сущность описывает человека, то мы можем выделить такие свойства, как имя, фамилия, рост, возраст, вес. Свойства необязательно представляют простые данные типа int, но и могут представлять более комплексные структуры данных. И у каждой сущности может быть одно или несколько свойств, которые будут отличать эту сущность от других и будут уникально определять эту сущность. Подобные свойства называют ключами.
При этом сущности могут быть связаны ассоциативной связью один–ко–многим, один-ко-одному и многие-ко-многим, подобно тому, как в реальной базе данных происходит связь через внешние ключи.
Отличительной чертой Entity Framework является использование запросов LINQ для выборки данных из БД. С помощью LINQ мы можем не только извлекать определенные строки, хранящие объекты, из бд, но и получать объекты, связанные различными ассоциативными связями.
Другим ключевым понятием является Entity Data Model. Эта модель сопоставляет классы сущностей с реальными таблицами в БД.
Entity Data Model состоит из трех уровней: концептуального, уровень хранилища и уровень сопоставления (маппинга).
На концептуальном уровне происходит определение классов сущностей, используемых в приложении.
Уровень хранилища определяет таблицы, столбцы, отношения между таблицами и типы данных, с которыми сопоставляется используемая база данных.
Уровень сопоставления (маппинга) служит посредником между предыдущими двумя, определяя сопоставление между свойствами класса сущности и столбцами таблиц.
Таким образом, мы можем через классы, определенные в приложении, взаимодействовать с таблицами из базы данных. Entity Framework предполагает три возможных способа взаимодействия с базой данных:
-
database first: Entity Framework создает набор классов, которые отражают модель конкретной базы данных;
-
model first: сначала разработчик создает модель базы данных, по которой затем Entity Framework создает реальную базу данных на сервере;
-
code first: разработчик создает класс модели данных, которые будут храниться в бд, а затем Entity Framework по этой модели генерирует базу данных и ее таблицы[7].
3.1.2 C#
C# – элегантный, типобезопасный объектно–ориентированный язык, предназначенный для разработки разнообразных безопасных и мощных приложений, выполняемых в среде .NET Framework. С помощью языка C# можно создавать обычные приложения Windows, XML–веб–службы, распределенные компоненты, приложения "клиент–сервер", приложения баз данных и т. д. Visual C# предоставляет развитый редактор кода, конструкторы с удобным пользовательским интерфейсом, встроенный отладчик и множество других средств, упрощающих разработку приложений на базе языка C# и .NET Framework.
Синтаксис C# очень выразителен, но прост в изучении. Все, кто знаком с языками C, C++ или Java с легкостью узнают синтаксис с фигурными скобками, характерный для языка C#. Разработчики, знающие любой из этих языков, как правило, смогут добиться эффективной работы с языком C# за очень короткое время. Синтаксис C# делает проще то, что было сложно в C++, и обеспечивает мощные возможности, такие как типы значений Nullable, перечисления, делегаты, лямбда–выражения и прямой доступ к памяти, чего нет в Java. C# поддерживает универсальные методы и типы, обеспечивая более высокий уровень безопасности и производительности, а также итераторы, позволяющие при реализации коллекций классов определять собственное поведение итерации, которое может легко использоваться в клиентском коде. Выражения LINQ делают строго типизированный запрос очень удобной языковой конструкцией.
Как объектно–ориентированный язык, C# поддерживает понятия инкапсуляции, наследования и полиморфизма. Все переменные и методы, включая метод Main – точку входа приложения – инкапсулируются в определения классов. Класс может наследовать непосредственно из одного родительного класса, но может реализовывать любое число интерфейсов. Для методов, которые переопределяют виртуальные методы в родительском классе, необходимо ключевое слово override, чтобы исключить случайное повторное определение. В языке C# структура похожа на облегченный класс: это тип, распределяемый в стеке, реализующий интерфейсы, но не поддерживающий наследование.
В дополнение к основным описанным объектно–ориентированным принципам, язык C# упрощает разработку компонентов программного обеспечения благодаря нескольким инновационным конструкциям языка, в число которых входят следующие:
-
инкапсулированные сигнатуры методов, называемые делегатами, которые поддерживают типобезопасные уведомления о событиях;
-
свойства, выступающие в роли методов доступа для закрытых переменных–членов;
-
атрибуты с декларативными метаданными о типах во время выполнения;
-
встроенные комментарии XML–документации;
-
LINQ, предлагающий встроенные возможности запросов в различных источниках данных.
Если потребуется обеспечить взаимодействие с другим программным обеспечением Windows, таким как объекты COM или собственные библиотеки DLL Win32, в языке C# можно использовать процесс, который называется "Interop." Процесс Interop позволяет программам на C# выполнять практически любые действия, которые может выполнять исходное приложение на C++. Язык C# поддерживает даже указатели и понятие "небезопасного" кода для тех случаев, когда прямой доступ к памяти имеет крайне важное значение.
Процесс построения C# по сравнению с C и C++ прост и является более гибким, чем в Java. Нет отдельных файлов заголовка, а методы и типы не требуется объявлять в определенном порядке. В исходном файле C# может быть определено любое число классов, структур, интерфейсов и событий. Программа на языке C# выполняется в среде .NET Framework – интегрированном компоненте Windows, содержащем виртуальную систему выполнения (среда CLR) и унифицированный набор библиотек классов. Среда CLR представляет собой коммерческую реализацию Майкрософт инфраструктуры CLI (common language infrastructure), международного стандарта, основы сред выполнения и разработки с тесным взаимодействием языков и библиотек.
Исходный код, написанный на языке C#, компилируется в промежуточный язык (IL) в соответствии со спецификацией CLI. Код IL и ресурсы, такие как растровые изображения и строки, хранятся на диске в исполняемом файле, называемом сборкой, с расширением EXE или DLL в большинстве случаев. Сборка содержит манифест со сведениями о типах сборки, версии, языке и региональных параметрах и требованиях безопасности.














