Концептуальная схема 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)