Разработка сущностной модели данных с помощью Entity Framework - Хранимые процедуры в сущностной модели

ОГЛАВЛЕНИЕ

Хранимые процедуры в сущностной модели

Во время создания модели мы добавили в нее хранимые процедуры, однако включены они были только в определение SSDL. Хранимые процедуры могут взаимодействовать с самыми различными таблицами, а также с другими объектами базы данных, поэтому платформа Entity Framework не берется автоматически сопоставить хранимую процедуру какой-то конкретной сущности в определении CSDL. Для создания метода, порождающего сопоставления для хранимой процедуры, нужно отредактировать код XML в файле EDMX.

Чтобы создать метод, который будет возвращать сущности данного типа, нам сначала нужно выбрать хранимую процедуру. В качестве примера мы добавим метод GetTenMostExpensiveProducts. Он будет вызывать хранимую процедуру Ten Most Expensive Products и возвращать объекты типа Product. Поскольку в коде SSDL хранимая процедура уже определена как элемент Function, нам нужно сделать следующий шаг — добавить метод в код CSDL. Для этого нужно добавить элемент FunctionImport в EntityContainer в качестве дочернего элемента:

<FunctionImport Name="GetTenMostExpensiveProducts"
  EntitySet="Products"
  ReturnType="Collection(Self.Products)">
</FunctionImport>

В атрибуте Name указывается имя метода для сущностного контейнера. В атрибуте EntitySet указывается набор EntitySet. Атрибут ReturnType ссылается на тип возвращаемых сущностей EntityType (или коллекцию значение EntityTypes, как в нашем случае).

Ссылка на Self в данном примере — это псевдоним, указывающий на текущее пространство имен, то есть на NWModel. Обратите внимание, что здесь можно было поставить как Self, так и NWModel.

Если для работы метода требуются параметры, их можно добавить при помощи тега <Parameter>. Например, если бы в хранимой процедуре был параметр CategoryId и мы бы решили его включить в метод, мы бы добавили в элемент FunctionImport следующий фрагмент кода XML:

<Parameter Name="CategoryId" Type="Int32" Mode="in"/>

Но в нашем примере параметры не используются, поэтому мы просто пропустим этот шаг.

Итак, в коде CSDL определен метод, тип сущностей, который он возвращает, и набор EntitySet, к которому должны принадлежать возвращаемые сущности, а в коде SSDL определена хранимая процедура. Теперь необходимо построить сопоставление между CSDL и SSDL, чтобы концептуальный метод знал, какую хранимую процедуру он должна выполнять. Сопоставление выполняется путем добавления следующего фрагмента кода (FunctionImportMapping) в раздел EntityContainerMapping в определении MSL:

<FunctionImportMapping 
  FunctionImportName="GetTenMostExpensiveProducts" 
  FunctionName="NWModel.Store.Ten_Most_Expensive_Products"/>

Здесь элемент FunctionImportMapping использует атрибут FunctionName — с его помощью он ссылается на полное имя элемента Function, определенного в SSDL. Элемент FunctionImportName ссылается на имя элемента FunctionImport, определенного в CSDL.