Модель EDM: наследование
Модель данных сущности (EDM) поддерживает наследование для типов сущностей. Наследование в модели (EDM) схоже с наследованием для классов в языках объектно-ориентированного программирования. Как и в классах на объектно-ориентированных языках, в концептуальной модели можно определить тип сущности ( производный тип), наследуемый от другого типа сущности (базовый тип). Однако в отличие от классов в объектно-ориентированном программировании, в концептуальной модели производный тип всегда наследует все свойства и свойства навигации базового типа. В производном типе нельзя отменить унаследованные свойства.
В концептуальной модели можно построить иерархию наследования, в которой один производный тип наследует свойства другого производного типа. Тип в верхней части иерархии (один тип в иерархии, который не является производным типом), называется корневым типом. В иерархии наследования ключ сущности должен быть определен для корневого типа.
Нельзя построить иерархии наследования, в которых один производный тип наследует свойства более чем одного типа. Например, в концептуальной модели с типом сущности Book
можно определить производные типы FictionBook
и NonFictionBook
, из которых каждый наследует свойства Book
. Тем не менее, в дальнейшем нельзя определить тип, который бы наследовал свойства обоих типов FictionBook
и NonFictionBook
.
Пример
На следующей схеме показана концептуальная модель с четырьмя типами сущностей: Book
, , FictionBook
Publisher
и Author
. Тип сущности FictionBook
является производным типом, который наследует свойства от типа сущности Book
. Тип FictionBook
наследует свойства ISBN (Key)
, Title
и Revision
, а также определяет дополнительное свойство Genre
.
В ADO.NET Entity Framework используется язык, зависящий от домена (DSL), называемый языком определения концептуальной схемы (CSDL) для определения концептуальных моделей. Далее язык CSDL определяет тип сущности, FictionBook
, который наследует свойства типа Book
(как показано на схеме выше).
<EntityType Name="FictionBook" BaseType="BooksModel.Book" >
<Property Type="String" Name="Genre" Nullable="false" />
</EntityType>