【ADO.NET Entity Framework】ストアドプロシージャの使用
こんちには、こだかです。
本日はADO.NET EntityFrameworkから、ストアドプロシージャの呼び出しを紹介します。
ストアドプロシージャは、EDM内に定義する事によって問題なく使用する事が可能です。
また、その結果を受け取るエンティティを定義する事によって、概念モデル内での操作が可能になっています。
本日はPubsデータベースに存在する、”byroyalty”を使用してみましょう。
定義は以下の様になっています。
CREATE PROCEDURE [dbo].[byroyalty] @percentage int
AS
select au_id from titleauthor
where titleauthor.royaltyper = @percentage
INPUTパラメータが1つ存在し、結果セットを返します。
これをCSDLで定義してみます。
CSDL---------------------------
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="https://schemas.microsoft.com/ado/2007/06/edmx">
<edmx:Designer>
<edmx:Connection />
<edmx:Options />
<edmx:ReverseEngineer />
<edmx:Diagrams />
</edmx:Designer>
<edmx:Runtime>
<!-- CSDL content -->
<edmx:ConceptualModels>
<Schema Namespace="pubsModel" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="pubsEntities">
<!--ストアドプロシージャ呼び出し結果受取エンティティ-->
<EntitySet Name="Byroyalty_Results" EntityType="pubsModel.Byroyalty_Result" />
<!--ストアドプロシージャエンティティ-->
<FunctionImport Name="byroyalty"
EntitySet="Byroyalty_Results"
ReturnType="Collection(pubsModel.Byroyalty_Result)">
<Parameter Name="percentage" Type="Int32" Mode="in" />
</FunctionImport>
</EntityContainer>
<!--ストアドプロシージャ呼び出し結果受取エンティティタイプ-->
<EntityType Name="Byroyalty_Result">
<Key>
<PropertyRef Name="au_id" />
</Key>
<Property Name="au_id" Type="String" Nullable="false" MaxLength="11" Unicode="false" />
</EntityType>
</Schema>
</edmx:ConceptualModels>
この様に定義を行う事になります。
(今回は説明の為、その他のエンティティは省略しています。)
SSDLとMSLは以下の様になります。
SSDL---------------------------
<!-- SSDL content -->
<edmx:StorageModels>
<Schema Namespace="pubsModel.Store" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<!--ストアドプロシージャ呼び出し結果受取ストアスキーマ-->
<EntitySet Name="Byroyalty_Results" EntityType="pubsModel.Store.Byroyalty_Result" />
</EntityContainer>
<!--ストアドプロシージャ呼び出し結果受取エンティティタイプ-->
<EntityType Name="Byroyalty_Result">
<Key>
<PropertyRef Name="au_id" />
</Key>
<Property Name="au_id" Type="varchar" Nullable="false" MaxLength="11" />
</EntityType>
<!--ストアドプロシージャ-->
<Function Name="byroyalty"
Aggregate="false"
BuiltIn="false"
NiladicFunction="false"
IsComposable="false"
ParameterTypeSemantics="AllowImplicitConversion"
Schema="dbo">
<Parameter Name="percentage" Type="int" Mode="in" />
</Function>
</Schema>
</edmx:StorageModels>
MSL---------------------------
<!-- C-S mapping content -->
<edmx:Mappings>
<Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo" CdmEntityContainer="pubsEntities">
<!--ストアドプロシージャマッピング-->
<FunctionImportMapping FunctionImportName="byroyalty"
FunctionName="pubsModel.Store.byroyalty"/>
<!--ストアドプロシージャ呼び出し結果受取エンティティマッピング
<EntitySetMapping Name="Byroyalty_Results" >
<EntityTypeMapping TypeName="IsTypeOf(pubsModel.Byroyalty_Result)" >
<MappingFragment StoreEntitySet="Byroyalty_Results" >
<ScalarProperty Name="au_id" ColumnName="au_id" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
</edmx:Mappings>
</edmx:Runtime>
</edmx:Edmx>
では、プログラムを書いて実行してみましょう。
プログラム----------------------------------------------------
static void Main(string[] args)
{
pubsEntities db = new pubsEntities();
foreach (Byroyalty_Result re in db.byroyalty(100))
{
Console.WriteLine(re.au_id);
}
}
非常に簡単ながら、結果が確認できたと思います。
ただ、残念ながら現状では、このEDMはADO.Net Entity Framework Tools Aug 07 CTPのみで作成する事はできません。
XMLでの定義になります、今後このあたりがどの様に実装されるか楽しみですね。
こだかたろう
Comments
- Anonymous
March 15, 2009
はじめまして、お だ です。 一昨年の記事ですが、参考にさせていただきました。