Основные понятия модели EDM
Модель данных сущности (EDM) использует три ключевых понятия для описания структуры данных: типа сущности, типа связи и свойства. Это самые важные основные понятия в описании структуры данных в любой реализации модели EDM.
Тип сущности
Тип сущности является основным стандартным блоком для описания структуры данных с помощью модели данных сущности. В концептуальной модели типы сущностей создаются из свойств и описывают структуру концепций верхнего уровня, таких как клиенты и заказы в бизнес-приложении. Так же как определение класса в компьютерной программе является шаблоном для экземпляров этого класса, тип сущности является шаблоном для сущностей. Сущность представляет определенный объект (например, определенного клиента или заказ). Каждая сущность должна иметь уникальный ключ сущности в наборе сущностей. Набор сущностей представляет собой коллекцию экземпляров определенного типа сущности. Наборы сущностей (и наборы ассоциаций) логически группируются в контейнер сущностей.
Наследование поддерживается для типов сущностей, то есть один тип сущности может быть производным от другого. Дополнительные сведения см. в разделе "Модель данных сущности: наследование".
Тип ассоциации
Тип ассоциации (также называемый ассоциацией) является основным стандартным блоком для описания связей в модели данных сущностей. В концептуальной модели ассоциация представляет собой связь между двумя типами сущностей (такими как клиент и заказ). Каждая ассоциация имеет две связи , указывающие типы сущностей, участвующие в ассоциации. Каждый конец ассоциации также указывает кратность конца ассоциации, указывающую количество сущностей, которые могут находиться в этом конце связи. Кратность конечной точки ассоциации может иметь значение «один» (1), «нуль или один» (0..1) или «много» (*). Сущности в одной части ассоциации можно получить через свойства навигации или через внешние ключи, если они предоставляются в типе сущности. Дополнительные сведения см. в свойстве внешнего ключа.
В приложении экземпляр ассоциации представляет собой специфическую ассоциацию (такую как ассоциация между экземпляром клиента и экземплярами заказа). Экземпляры ассоциации логически группируются в наборе ассоциаций. Наборы ассоциаций (и наборы сущностей) логически группируются в контейнер сущностей.
Свойство
Типы сущностей содержат свойства , определяющие их структуру и характеристики. Например, тип сущности «Клиент» может иметь свойства, такие как идентификатор клиента, имя и адрес.
Свойства в концептуальной модели аналогичны свойствам, которые определены применительно к классу в компьютерной программе. По такому же принципу, как свойства, относящиеся к классу, определяют форму класса и несут информацию об объектах, свойства в концептуальной модели определяют форму типа сущности и несут информацию об экземплярах типа сущности.
Свойство может содержать примитивные данные (такие как строка, целое число, логическое значение) или структурированные данные (такие как сложный тип). Дополнительные сведения см. в разделе "Модель данных сущности: примитивные типы данных".
Представления концептуальной модели
Концептуальная модель — это определенное представление структуры некоторых данных в виде сущностей и связей. Одним из способов представления концептуальной модели является схема. На приведенной ниже схеме представлена концептуальная модель с тремя типами сущностей (Book
, Publisher
и Author
) и двумя ассоциациями (PublishedBy
и WrittenBy
).
Это представление, однако, имеет недостатки в плане более подробных сведений о модели. Например, информация о типе свойства или наборе сущностей не содержится в схеме. Структура концептуальной модели может быть передана более точно при помощи доменного языка (DSL). В ADO.NET Entity Framework для определения концептуальных моделей используется DSL на основе XML, называемого языком определения концептуальной схемы (CSDL). Далее на языке CSDL определяется концептуальная модель из приведенной выше схемы.
<Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm"
xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration"
xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
Namespace="BooksModel" Alias="Self">
<EntityContainer Name="BooksContainer" >
<EntitySet Name="Books" EntityType="BooksModel.Book" />
<EntitySet Name="Publishers" EntityType="BooksModel.Publisher" />
<EntitySet Name="Authors" EntityType="BooksModel.Author" />
<AssociationSet Name="PublishedBy" Association="BooksModel.PublishedBy">
<End Role="Book" EntitySet="Books" />
<End Role="Publisher" EntitySet="Publishers" />
</AssociationSet>
<AssociationSet Name="WrittenBy" Association="BooksModel.WrittenBy">
<End Role="Book" EntitySet="Books" />
<End Role="Author" EntitySet="Authors" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Book">
<Key>
<PropertyRef Name="ISBN" />
</Key>
<Property Type="String" Name="ISBN" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" />
<Property Type="Decimal" Name="Revision" Nullable="false" Precision="29" Scale="29" />
<NavigationProperty Name="Publisher" Relationship="BooksModel.PublishedBy"
FromRole="Book" ToRole="Publisher" />
<NavigationProperty Name="Authors" Relationship="BooksModel.WrittenBy"
FromRole="Book" ToRole="Author" />
</EntityType>
<EntityType Name="Publisher">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Type="Int32" Name="Id" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.PublishedBy"
FromRole="Publisher" ToRole="Book" />
</EntityType>
<EntityType Name="Author">
<Key>
<PropertyRef Name="Name" />
<PropertyRef Name="Address" />
</Key>
<Property Type="String" Name="Name" Nullable="false" />
<Property Type="String" Name="Address" Nullable="false" />
<NavigationProperty Name="Books" Relationship="BooksModel.WrittenBy"
FromRole="Author" ToRole="Book" />
</EntityType>
<Association Name="PublishedBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Publisher" Role="Publisher" Multiplicity="1" />
</Association>
<Association Name="WrittenBy">
<End Type="BooksModel.Book" Role="Book" Multiplicity="*" />
<End Type="BooksModel.Author" Role="Author" Multiplicity="*" />
</Association>
</Schema>