Поделиться через


Схемы (модель EDM)

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

Схема создается на языке CSDL. Вторая схема, написанная на языке SSDL, определяет модель хранения для приложения, использующего модель EDM.

В данном разделе описываются схемы на языке CSDL. Дополнительные сведения о метаданных хранилища и схемах сопоставления см. в разделе Спецификация схем и сопоставлений (платформа Entity Framework).

Элемент верхнего уровня в схеме задает пространство имен, в котором действуют правила уникальности имен. Типы, определенные в следующей сокращенной схеме, логически организованы в пространстве имен MyCompany.LOBSchema. Это пространство имен напоминает пространство имен в объектно-ориентированном программировании, содержащее классы и программный код процедур и функций. Модель EDM не задает процедур. Сведения о реализации процедур в модели EDM см. в разделе Вспомогательные методы (модель EDM).

Каждая сущность или ассоциация, определенная в следующей схеме, имеет полное имя, например MyCompany.LOBSchema.Customer. В данном примере полные имена сокращаются с помощью псевдонима Self, объявленного в пространстве имен MyCompany.LOBSchema, например Self.Customer.

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

<?xml version="1.0" encoding="utf-8"?>
<Schema xmlns="https://schemas.microsoft.com/ado/2006/04/edm" 
        Namespace="MyCompany.LOBSchema" Alias="Self">

    <Documentation>
      <Summary>Conceptual schema (csdl)</Summary>
      <LongDescription>This schema is an example showing 
        general syntax.</LongDescription>
    </Documentation>

    <EntityType Name="Customer">
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <EntityType Name="Order">
        <Key>
            <PropertyRef Name="OrderId" />
        </Key>
        <Property Name="OrderId" Type="Guid" Nullable="false" />
        <!-- Other properties-->
    </EntityType>

    <Association Name="Customer_Order">
        <End Role="Customer" Type="Self.Customer" Multiplicity="0..1" />
        <End Role="Order" Type="Self.Order" Multiplicity="*" />
    </Association>

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer" />
        <EntitySet Name="Orders" EntityType="Self.Order" />
        <AssociationSet Name="Customer_Orders" Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers" />
            <End Role="Order" EntitySet="Orders" />
        </AssociationSet>
    </EntityContainer>
</Schema>

Псевдоним для схемы, определенной в другом CSDL-файле, можно задать с помощью тега Using; это позволяет использовать существующие типы из внешних схем в определяемом пространстве имен, не прибегая к синтаксису полного имени.

В полных схемах декларации сущностей включают в себя свойства. Одно из свойств назначается ключевым — Key. Атрибут Key тега EntityType указывает одно или несколько свойств сущности как Key. Одно свойство Key может входить в состав нескольких свойств. Свойство Key уникальным образом идентифицирует экземпляры сущности для любых операций.

В следующем примере атрибут Key объявляется как CustomerId внутри открывающего тега EntityType, после того как сущности присваивается атрибут Name. Атрибут Type свойства CustomerIdKey имеет значение Guid, чтобы задать уникальное значение для атрибута Key. Декларация свойства CustomerId находится во второй строке этого CSDL-сегмента.

    <EntityType Name="Customer" >
        <Key>
            <PropertyRef Name="CustomerId" />
        </Key>
        <Property Name="CustomerId" Type="Guid" Nullable="false" />
        <Property Name="Title" Type="String" Nullable="false" />
    </EntityType>

В последней строке примера объявляется свойство Title, а также указывается, что тип свойства Title равен String. Свойство Title хранит сведения о должности заказчика. Свойство Title не может иметь значения Null, что задается ограничением Nullability="false". Атрибут Default свойства Title, имеющего тип String, имеет значение "NewHire".

В следующем запросе показано создание составного ключа.

<EntityType Name="EmployeePayHistory">
    <Key>
      <PropertyRef Name="EmployeeID" />
      <PropertyRef Name="RateChangeDate" />
    </Key>
    <Property Name="EmployeeID" Type="Int32" Nullable="false" />
    <Property Name="RateChangeDate" Type="DateTime" Nullable="false"/>
    <Property Name="Rate" Type="Decimal" Nullable="false"/>
    <Property Name="PayFrequency" Type="Boolean" Nullable="false" />
    <Property Name="ModifiedDate" Type="DateTime" Nullable="false" />
    <NavigationProperty Name="Employee"
Relationship="Adventureworks.FK_EmployeePayHistory_Employee_EmployeeID"
 FromRole="EmployeePayHistory" ToRole="Employee" />
  </EntityType>

Контейнер сущностей

Схемы, использующие модель EDM, определяют контейнер сущностей, чтобы задать наборы типов данных, доступные в определяемом пространстве имен. Контейнер сущностей является основой для пространства имен в программируемой модели объектов, которая будет построена по CSDL-схеме.

В иерархии XML элемент EntityContainer отделен от элемента Schema, несмотря на то что элемент EntityContainer определен в схеме. Это важно при сопоставлении контейнера EntityContainer с хранилищем. Теги EntityContainer в концептуальной схеме сопоставлены с соответствующими тегами EntityContainer в метаданных хранилища. Обратите внимание, что в файле сопоставления полное имя элемента EntityContainer не включает имя пространства имен схемы.

Наборы сущностей моделируют классы программируемой модели объектов. Наборы ассоциаций задают область связей. Дополнительные сведения о наборах сущностей и наборах ассоциаций см. в разделах Наборы сущностей (модель EDM) и Наборы ассоциаций (модель EDM).

Следующий сегмент схемы содержит декларацию контейнера EntityContainer для пространства имен LOBSchemaData в пространстве имен MyCompany.LOBSchema.

    <EntityContainer Name="LOBSchemaData">
        <EntitySet Name="Customers" EntityType="Self.Customer"/>
        <EntitySet Name="Orders" EntityType="Self.Order"/>
        <AssociationSet Name="Customer_Orders" 
                          Association="Self.Customer_Order">
            <End Role="Customer" EntitySet="Customers"/>
            <End Role="Order" EntitySet="Orders"/>
        </AssociationSet>
    </EntityContainer>

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

При реализации спецификаций этой схемы в виде типов данных каждый экземпляр сущностей Customer и Order становится членом соответствующего набора EntitySet. Этот контейнер сущностей задает наборы сущностей Customer и Order, именованные во множественном числе: Customers и Orders. Разработчики могут создавать собственные соглашения об именах. Дополнительные сведения о соответствии имен именам в метаданных хранилища и спецификации сопоставления см. в разделе Спецификация схем и сопоставлений (платформа Entity Framework).

Теги AssociationSet в предыдущей декларации контейнера EntityContainer задают набор ассоциаций с именем Customer_Orders. Этот набор ассоциаций содержит экземпляры ассоциации Customer_Order.

Эти элементы (EntityType, EntitySet, Association, AssociationSet и EntityContainer) в сочетании образуют базовую структуру схемы. Дополнительные описания отдельных строк деклараций в схемах см. в разделе Спецификация схем и сопоставлений (платформа Entity Framework).

Развертывание

Спецификация модели EDM после определения типов сущностей на языке CSDL не задает конкретную модель хранения. Наиболее распространен сценарий, когда источником данных служит система управления реляционной базой данных (СУРБД). Для развертывания модели хранения нужно создать базу данных и таблицы, соответствующие сущностям, определенным в схеме. Для реализации может потребоваться также задание внешних ключей в таблицах данных или связывание таблиц между собой для поддержки ассоциаций.

Модель EDM можно использовать с существующей базой данных, если задать сопоставление базы данных и таблиц типам модели EDM. Существующие программные модели объектов можно также сопоставить с типами модели EDM.

См. также

Основные понятия

Связи в модели EDM
Типы модели EDM
Элемент EntityType (язык CSDL)
Элемент EntitySet (EntityContainer, язык CSDL)
Элемент Association (язык CSDL)
Элемент AssociationSet (EntityContainer, язык CSDL)
Элемент EntityContainer (язык CSDL)

Другие ресурсы

Спецификация схем и сопоставлений (платформа Entity Framework)