こんちには、こだかです。
本日はADO.NET EntityFrameworkから、ストアドプロシージャの呼び出しを紹介します。ストアドプロシージャは、EDM内に定義する事によって問題なく使用する事が可能です。また、その結果を受け取るエンティティを定義する事によって、概念モデル内での操作が可能になっています。本日はPubsデータベースに存在する、”byroyalty”を使用してみましょう。定義は以下の様になっています。CREATE PROCEDURE [dbo].[byroyalty] @percentage intASselect au_id from titleauthorwhere titleauthor.royaltyper = @percentage
INPUTパラメータが1つ存在し、結果セットを返します。これをCSDLで定義してみます。
CSDL---------------------------<?xml version="1.0" encoding="utf-8"?><edmx:Edmx Version="1.0" xmlns:edmx="http://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="http://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="http://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での定義になります、今後このあたりがどの様に実装されるか楽しみですね。
こだかたろう