Partilhar via


【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
    はじめまして、お だ です。 一昨年の記事ですが、参考にさせていただきました。