Реализация сущностей (модель EDM)
Во всех приложениях модели Entity Data Model (EDM) сущности определяются на языке CSDL и сопоставляются метаданным, описывающим структуры данных на языке SSDL. В данном примере показано создание одной сущности и ее сопоставление с хранилищем.
Приложение, для которого создана эта сущность, хранит информацию о сотрудниках предприятия.
Концептуальная схема
Сущность, определенная в следующей конструкции на языке CSDL, содержит спецификации типа данных в пространстве имен Namespace с именем Employes
. Пространство имен Namespace содержит единственную декларацию типа сущности EntityType: Employees
.
Свойства сущности Employees
содержат основные данные о сотруднике. Свойство EmployeeId
объявлено как относящееся к типу Guid и, следовательно, уникальным образом определяет экземпляр типа. Свойство EmployeeId
объявлено ключом.
Для идентификации сотрудника служат еще три свойства: имя FirstName
, фамилия LastName
и адрес электронной почты Email
.
Помимо спецификации сущности CSDL-схема содержит декларации набора сущностей EntitySet и контейнера EntityContainer. Декларации EntityContainer и EntitySet определяют область действия типов данных в модели данных. Контейнер EntityContainer содержит набор EntitySet. В этом примере набор сущностей EntitySet с именем Employees
содержит тип сущности Employee
.
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="EmployeesContext">
<EntitySet Name="Employees" EntityType="Employees.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="Guid" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false" />
<Property Name="FirstName" Type="String" Nullable="false" />
<Property Name="Email" Type="String" Nullable="false" />
</EntityType>
</Schema>
Схема Namespace содержит сущность Employee
и все наборы, кроме элемента EntityContainer, отдельного и не зависимого от пространства имен Namespace схемы. Дополнительные сведения об элементе EntityContainer см. в разделе Элемент EntityContainerMapping (язык MSL).
Приложения, построенные на этой модели данных, ссылаются на пространство имен Namespace, чтобы использовать класс, построенный на этой модели.
Эта спецификация на языке CSDL называется концептуальной схемой. Параллельные имена сущностей в метаданных хранилища, описанных на языке SSDL, соответствуют структурам хранилища. Набор сущностей EntitySet в этой CSDL-схеме соответствует имени таблицы, заданной в SSDL-схеме. Эта таблица содержит данные экземпляров сущности Employee
, используемой в приложениях, построенных на основе этой модели. Свойства сущности Employee
соответствуют столбцам таблицы.
Схема хранения
Метаданные хранилища, заданные на языке SSDL, описывают базу данных, содержащую экземпляры объекта Employees
, определенные в концептуальной схеме.
Пространство имен Employees.Store
, заданное в следующей схеме, является базой данных-получателем модели Employees
, определенной в концептуальной схеме.
Набор сущностей EntitySetEmployees
в этой схеме представляет таблицу базы данных с именем Employees
. Тип сущности EntityType, заданный этой схемой, соответствует типу сущности EntityType, заданному концептуальной схемой. Имя в метаданных хранилища не обязательно должно соответствовать имени в концептуальной схеме, но должно соответствовать имени таблицы в базе данных.
В следующей схеме описан объект базы данных dbo
, представленный контейнером EntityContainer, описанным в SSDL-файле. Контейнер EntityContainer в этом примере содержит таблицу с именем Employees
.
?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Employees" EntityType="Employees.Store.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" />
<Property Name="Email" Type="nvarchar" Nullable="false" />
</EntityType>
</Schema>
Спецификация сопоставления
Спецификация сопоставления задается на языке MSL. Эта спецификация MSL связывает CSDL-схему с базой данных, используя метаданные из схемы SSDL.
К элементам данной MSL-схемы относятся сопоставления EntityContainerMapping, StorageEntityContainer, EntityTypeMapping, MappingFragment и ScalarProperty. Сопоставление EntityContainerMapping задает соответствие контейнера CdmEntityContainer контейнеру StorageEntityContainer (в данном случае — контейнера сущностей EmployeeSkills
объекту базы данных dbo
).
Отметьте, что имена, назначенные контейнерам StorageEntityContainer и CdmEntityContainer, не уточняются с помощью пространств имен схемы. Контейнеры StorageEntityContainer и CdmEntityContainer раздельны и независимы от элемента схемы как в концептуальной схеме, так и в метаданных хранилища. Если уточнить имена контейнеров StorageEntityContainer и CdmEntityContainer с помощью имени пространства имен, при сопоставлении будет выдано исключение.
После сопоставления контейнеров StorageEntityContainer и CdmEntityContainer сопоставление EntitySetMapping задает набор сущностей StoreEntitySet, который соответствует концептуальному набору сущностей.
TypeName, Employees
.
Свойства TypeName сопоставляются с помощью элементов ScalarProperty как атрибуты Name, которые соответствуют элементам ColumnName, например Name="EmployeeId" ColumnName="EmployeeId"
. Синтаксис Name задает свойство сущности в концептуальной схеме, а ColumnName указывает столбец таблицы данных Employees
в базе данных-получателе.
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="EmployeesContext">
<EntitySetMapping Name="Employees" StoreEntitySet="Employees"
TypeName="Employees.Employees">
<ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Email" ColumnName="Email" />
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
См. также
Основные понятия
Реализация ассоциаций (модель EDM)
Другие ресурсы
Спецификация схем и сопоставлений (платформа Entity Framework)
Спецификации модели EDM