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


Ключ сущности

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

Ниже приведены требования к набору свойств, которые должны быть ключом сущности:

  • Два ключа сущности в наборе сущностей не могут быть идентичными. То есть для всех двух сущностей в наборе сущностей значения для всех свойств, составляющих ключ, не могут быть одинаковыми. Однако некоторые (но не все) значения, составляющие ключ сущности, могут быть одинаковыми.

  • Ключ сущности должен состоять из набора непустых, неизменяемых свойств примитивного типа.

  • Свойства, составляющие ключ сущности для заданного типа сущности, не могут измениться. Невозможно разрешить несколько возможных ключей сущностей для заданного типа сущности; Суррогатные ключи не поддерживаются.

  • Если сущность участвует в иерархии наследования, корневая сущность должна содержать все свойства, составляющие ключ сущности, и ключ сущности должен быть определен в типе корневой сущности. Дополнительные сведения см. в разделе "Модель данных сущности: наследование".

Пример

На схеме ниже показана концептуальная модель с тремя типами сущностей: Book, Publisherи Author. Свойства каждого типа сущности, составляющие его ключ сущности, указываются на "(Key)". Обратите внимание, что Author тип сущности имеет ключ сущности, состоящий из двух свойств и NameAddress.

Пример модели с тремя типами сущностей

В ADO.NET Entity Framework используется язык, зависящий от домена (DSL), называемый языком определения концептуальной схемы (CSDL) для определения концептуальных моделей. CSDL, представленный ниже, определяет тип сущности Book, показанный на схеме выше. Обратите внимание, что ключ сущности определяется путем ссылки на ISBN свойство типа сущности.

<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>

Свойство ISBN является хорошим выбором для ключа сущности, так как международный номер стандартной книги (ISBN) однозначно идентифицирует книгу.

CSDL, представленный ниже, определяет тип сущности Author, показанный на схеме выше. Обратите внимание, что ключ сущности состоит из двух свойств Name и Address.

<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>

Использование Name и Address для ключа сущности является разумным выбором, так как два автора одного и того же имени вряд ли будут жить по одному адресу. Однако этот выбор для ключа сущности не гарантирует абсолютно уникальные ключи сущностей в наборе сущностей. Добавление свойства, например AuthorId, которое можно использовать для уникальной идентификации автора, рекомендуется в этом случае.

См. также