Наборы сущностей (модель EDM)
В Entity Data Model (модели EDM) EntitySet представляет собой логический контейнер для сущностей одного типа. Точно так же объект AssociationSet представляет контейнер для ассоциаций одного типа. Определенные в схемах наборы сущностей и ассоциаций сопоставляются с таблицами в базе данных, где хранятся данные для приложений. Наборы сущностей и ассоциаций — основа классов программной модели объектов, которая будет использоваться в коде приложения.
Наборы сущностей и наборы ассоциаций определяют область сущностей и ассоциаций; контейнеры сущностей определяют контейнеры хранилища, где размещаются сущности и ассоциации. Отсутствуют наборы SimpleType. Эти типы представлены экземплярами значений, заданных для свойств сущности.
Набор EntitySet для EntityType содержит экземпляры типа EntityType или одного из его подтипов. Можно определить несколько наборов EntitySet, используя один и тот же тип EntityType. Экземпляр типа EntityType может быть элементом только одного набора EntitySet.
Экземпляры сущностей в наборе EntitySet должны удовлетворять трем условиям.
Тип экземпляра сущности должен быть или типом EntityType набора EntitySet, или подтипом типа EntityType.
Значение Key каждого экземпляра сущности уникально определяет его в наборе EntitySet.
Экземпляр сущности не является элементом ни одного другого набора EntitySet.
Следующая синтаксическая конструкция на языке CSDL представляет собой декларацию набора сущностей EntitySet с именем CustomerSet
. Набор EntitySet содержит экземпляры сущности CustomerType
.
<EntitySet Name="CustomerSet" EntityType="CustomerType"/>
В следующем сегменте схемы две декларации EntityType определяют типы сущностей Product
и Supplier
. Наборы сущностей, основанные на сущностях Product
и Supplier
, именуются соответствующим образом в форме множественного числа: Products
и Suppliers
. Эти наборы сущностей добавляются к определению контейнера EntityContainer.
<?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="MyCompany.LOBSchema" Alias="Self">
<EntityType Name="Product">
<Key>
<PropertyRef Name="ProductID" />
</Key>
<Property Name="ProductID" Type="Int32" Nullable="false" />
<Property Name="ProductName" Type="String" Nullable="false" />
<Property Name="UnitPrice" Type="Decimal" Nullable="true" />
<Property Name="UnitsInStock" Type="Int16" Nullable="true" />
</EntityType>
<EntityType Name="Supplier">
<Key>
<PropertyRef Name="SupplierID" />
</Key>
<Property Name="SupplierID" Type="Int32" Nullable="false" />
<Property Name="CompanyName" Type="String" Nullable="false" />
<Property Name="ContactName" Type="String" Nullable="true" />
<Property Name="HomePage" Type="String" Nullable="true" />
</EntityType>
<EntityContainer Name="LOB-Data">
<EntitySet Name="Products" EntityType="Product" />
<EntitySet Name="Suppliers" EntityType="Supplier" />
</EntityContainer>
</Schema>
Дополнительные сведения о контейнерах сущностей см. в разделе Контейнеры сущностей (модель EDM).
Несколько наборов сущностей на тип
Модель EDM позволяет хранить в одном контейнере сущностей несколько наборов сущностей или определять несколько контейнеров сущностей для одного типа сущности. Определение нескольких наборов сущностей на тип (MEST) позволяет пользователям упростить код, когда к базам данных применено секционирование, а также в других подобных ситуациях, когда несколько таблиц имеют одну и ту же структуру.
Существует ряд причин для секционирования баз данных – соображения производительности, готовности или управляемости. Финансовое учреждение, управляющее счетами большого числа клиентов, может для достижения более высокого быстродействия секционировать свои СУБД в соответствии с региональным распределением клиентских данных. Операции по поиску и обновлению данных будут совершаться более оперативно, когда они будут выполняться применительно к региональному подмножеству данных. При реализации схемы «несколько наборов сущностей на тип» (MEST) секционирование должно осуществляться внутри одной базы данных. Если секционирование производится в различных базах данных, вместо сценария MEST следует использовать различные строки соединения и различные контексты.
Еще один сценарий, в котором может быть с пользой применено секционирование, реализуется в ситуациях, когда сотрудники IT-подразделения хотят создавать резервные копии часто используемых данных в ночное время, а данные, не востребованные в течение более чем одного года, архивируются. Данные о клиентах, которые не пользовались своими учетными записями в течение более одного года, администраторы баз данных могут переносить в архивные таблицы с той же схемой таблицы.
Важно принимать во внимание структуру ассоциаций между типами сущностей, являющихся членами более одного набора сущностей. Схема MEST проще всего реализуется в соответствии с уже протестированной структурой. Следующие сценарии были успешно использованы.
В ассоциации «один ко многим» сущность, реализованная как MEST в элементе ассоциации «один», должна иметь связь с двумя различными наборами сущностей в элементе «много». Так, следующий сценарий может быть реализован с типом сущности
Customer
в двух наборах сущностей:PreferedCustomers
иCreditRiskCustomers
.PreferedCustomers <1-----*> Orders
CreditRiskCustomers <1-----*> CreditReports
В ассоциации «один ко многим» набор сущностей в элементе ассоциации «один» может иметь связь с сущностью, реализованной как MEST, в элементе «много». К примеру, сущность
Product
может быть включена в два набора сущностей и ассоциацию с сущностьюManufacturingUnit
.ManufacturingUnit <1-----*> Products
ManufacturingUnit <1----*> DefectiveProducts
Реализовать схему MEST в сценарии «один к одному» или «многие ко многим» будет сложно при разработке логической модели и/или при сопоставлении логической модели с концептуальной моделью. В сценарии MEST «один к одному» или «многие ко многим» возникает та же проблема, что и в ситуации, когда схема MEST в элементе «один» имеет связь с тем же набором сущностей в элементе «много». В схеме «один к одному» можно сформировать логическую модель, аналогичную модели «один ко многим».
При конструировании логической модели следующий сценарий заказов приведет к проблемам.
PreferedCustomers <1-----*> Orders
CreditRiskCustomers <1-----*> Orders
Дополнительные сведения см. в разделе Как определить модель с несколькими наборами сущностей на тип (платформа Entity Framework).
См. также
Основные понятия
Элемент Association (модель EDM)
Наборы ассоциаций (модель EDM)
Контейнеры сущностей (модель EDM)
Типы модели EDM
Простые типы (модель EDM)
Другие ресурсы
Спецификация схем и сопоставлений (платформа Entity Framework)