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


Концептуальная схема Northwind (модель EDM)

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

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

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

Образцом схемы в этом разделе определяются четыре сущности и две ассоциации. Типы сущностей являются производными схем базового класса, установленными с ADO.NET. Общие сведения о схемах и сопоставлении см. в разделе Спецификация схем и сопоставлений (платформа Entity Framework).

В следующем примере открывающий тег <Schema> содержит декларацию определяемого пространства имен: NorthwindLib. Это пространство имен имеет псевдоним Self, который используется в качестве краткого идентификатора в тексте схемы. URL-адреса в открывающем теге <Schema> одинаковы для всех приложений модели EDM.

Теги <Documentation> включают полезные сведения для разработчиков. Текст между тегами Documentation представляет собой нечто большее, чем простые комментарии в коде. После создания объектной библиотеки эти сведения появляются в обозревателе объектов среды Visual Studio и других средствах просмотра классов. В этом примере текст идентифицирует схему, определенную в XML-файле.

Три сущности в этом примере определяются внутри тегов <EntityType>. Каждая сущность включает атрибут Key, задающий свойство сущности, которое является уникальным идентификатором экземпляров этого типа. Два типа <Association> заданы свойствами Name и End Role, которые определяют область для типов, связанных ассоциациями. В этом примере одна ассоциация и свойство навигации соединяют экземпляры сущности Product с сущностями Category, с которыми они логически связаны. Другая ассоциация соединяет экземпляры заказов Order с экземплярами клиентов Customers, делающих заказы. Дополнительные сведения об ассоциациях см. в разделе Связи в модели EDM.

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

  <EntityType Name="Product">
    <Key>
      <PropertyRef Name="ProductID" />
    </Key>
    <Property Name="ProductID" Type="Int32" Nullable="false" />
    <Property Name="ProductName" Type="String" 
                Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="UnitPrice" Type="Decimal" 
                Nullable="true" ConcurrencyMode="Fixed" />
    <NavigationProperty Name="Category"
          Relationship="Self.Category_Product" FromRole="Product"
          ToRole="Category" />
  </EntityType>

  <EntityType Name="DiscontinuedProduct" BaseType="Self.Product">
    <!-- Units in stock for discontinued products. -->
    <Property Name="UnitsInStock" Type="Int16" Nullable="true" />
  </EntityType>

  <EntityType Name="Customer">
    <Key>
      <PropertyRef Name="CustomerID" />
    </Key>
    <Property Name="CustomerID" Type="String" Nullable="false" />
    <Property Name="CompanyName" Type="String"
              Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="ContactName" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <Property Name="City" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <Property Name="Country" Type="String"
              Nullable="true" ConcurrencyMode="Fixed" />
    <NavigationProperty Name="SalesOrders"
            Relationship="Self.Customer_Order" FromRole="Customer"
            ToRole="SalesOrder" />
  </EntityType>

  <EntityType Name="Category">
    <Key>
      <PropertyRef Name="CategoryID" />
    </Key>
    <Property Name="CategoryID" Type="Int32" Nullable="false" />
    <Property Name="CategoryName" Type="String"
                  Nullable="false" ConcurrencyMode="Fixed" />
    <Property Name="Description" Type="String" Nullable="true" />
    <NavigationProperty Name="Products"
        Relationship="Self.Category_Product"
        FromRole="Category" ToRole="Product" />
  </EntityType>

  <EntityType Name="SalesOrder">
    <Key>
      <PropertyRef Name="OrderID" />
    </Key>
    <Property Name="OrderID" Type="Int32" Nullable="false" />
    <Property Name="OrderDate" Type="DateTime" Nullable="true" />
    <Property Name="ShipCity" Type="String" Nullable="true" />
    <Property Name="ShipCountry" Type="String" Nullable="true" />
    <NavigationProperty Name="Customer"
       Relationship="Self.Customer_Order"
       FromRole="SalesOrder" ToRole="Customer" />
  </EntityType>

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

  <Association Name="Category_Product">
    <End Role="Category" Type="Self.Category" Multiplicity="1" />
    <End Role="Product" Type="Self.Product" Multiplicity="*" />
  </Association>

  <EntityContainer Name="Northwind">
    <EntitySet Name="Categories" EntityType="Self.Category" />
    <EntitySet Name="Products" EntityType="Self.Product" />
    <EntitySet Name="Customers" EntityType="Self.Customer" />
    <EntitySet Name="SalesOrders" EntityType="Self.SalesOrder" />
    <AssociationSet Name="CustomerOrders"
                  Association="Self.Customer_Order">
      <End Role="Customer" EntitySet="Customers" />
      <End Role="SalesOrder" EntitySet="SalesOrders" />
    </AssociationSet>
    <AssociationSet Name="CategoryProducts"
                  Association="Self.Category_Product">
      <End Role="Category" EntitySet="Categories" />
      <End Role="Product" EntitySet="Products" />
    </AssociationSet>
  </EntityContainer>

</Schema>

Чаще всего в этой схеме используются теги <Property>. Свойства указывают различные типы данных, которые содержит каждый тип сущности <EntityType>. Например, свойства сущности Product включают следующее: ProductID, ProductName, UnitPrice и свойство навигации NavigationProperty с именем Category, связывающее этот продукт с набором похожих продуктов. Эта группа свойств определяет сущность Product.

Теги <EntityContainer> модели EDM определяют контейнер, который будет сопоставлен с объектом базы данных (dbo) в схеме метаданных хранилища. В этом контейнере <EntityContainer> имеются три спецификации <EntitySet> и две спецификации <AssociationSet>.

Дополнительные сведения о синтаксисе XML, используемом в файле CSDL, см. в разделе Схемы (модель EDM). Сведения о свойствах навигации см. в разделе Реализация ассоциаций (модель EDM).

См. также

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

Типы модели EDM
Связи в модели EDM
Схемы (модель EDM)
Реализация ассоциаций (модель EDM)

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

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