チュートリアル : EDMX スキーマ ファイルからの F# 型の生成 (F#)

F# 3.0 に関するこのチュートリアルでは、スキーマが .edmx ファイルで指定されている、エンティティ データ モデル (EDM) で表現されるデータの型を作成する方法を示します。また、EdmxFile 型プロバイダーを使用する方法も示します。開始する前に、SqlEntityConnection 型プロバイダーの方がより適切な選択かどうかを検討します。SqlEntityConnection 型プロバイダーは、プロジェクトの開発フェーズで接続できるライブ データベースがあり、コンパイル時に接続文字列の指定について気にする必要がない場合に最適な選択です。ただし、この型プロバイダーは、EdmxFile 型プロバイダーと比べて公開するデータベース機能が少ないという制約があります。また、エンティティ データ モデルを使用するデータベース プロジェクトのライブ データベース接続がない場合は、.edmx ファイルを使用してデータベースに対するコードを記述できます。EdmxFile 型プロバイダーを使用する場合、F# コンパイラが EdmGen.exe を実行して、指定する型を生成します。

このチュートリアルでは以下の作業について説明します。このチュートリアルを正しく行うには、これらの作業を順に行ってください。

  • Creating an EDMX file

  • Creating the project

  • Finding or creating the entity data model connection string

  • Configuring the type provider

  • Querying the data

  • Calling a stored procedure

EDMX ファイルの作成

既に EDMX ファイルがある場合は、この手順を省略できます。

EDMX ファイルを作成するには

  • EDMX ファイルがない場合は、「ADO.NET Entity Framework クイック スタート」の手順に従い、データベースのエンティティ データ モデルおよび EDMX ファイルを作成します。または、このチュートリアルの最後にある手順「To configure the Entity Data Model」も参照できます。

プロジェクトの作成

この手順では、プロジェクトを作成し、EDMX 型プロバイダーを使用するために適切な参照を追加します。

F# プロジェクトを作成してセットアップするには

  1. 前のプロジェクトを閉じ、別のプロジェクトを作成して「SchoolEDM」という名前を付けます。

  2. ソリューション エクスプローラーで、[参照] のショートカット メニューを開き、[参照の追加] をクリックします。

  3. [アセンブリ] 領域で、[フレームワーク] ノードを選択します。

  4. 使用可能なアセンブリの一覧で、System.Data.Entity アセンブリと System.Data.Linq アセンブリを選択し、[追加] をクリックして、これらのアセンブリへの参照をプロジェクトに追加します。

  5. [アセンブリ] 領域で、[拡張機能] ノードを選択します。

  6. 使用できる拡張機能の一覧で、FSharp.Data.TypeProviders アセンブリへの参照を追加します。

  7. 次のコードを追加し、適切な名前空間を開きます。

    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    

エンティティ データ モデルの接続文字列の検索または作成

エンティティ データ モデルの接続文字列 (EDMX 接続文字列) には、データベース プロバイダーの接続文字列だけではなく追加情報も含まれます。たとえば、簡単な SQL Server データベースの EDMX 接続文字列は次のコードのようになります。

let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"

EDMX 接続文字列の詳細については、「Connection Strings」を参照してください。

エンティティ データ モデルの接続文字列を検索または作成するには

  • EDMX 接続文字列は、手動で生成することが困難な場合があります。そのため、プログラムにより生成することで時間を節約できます。EDMX 接続文字列がわかっている場合は、この手順を省略し、次の手順でその接続文字列を使用できます。そうでない場合は、次のコードを使用し、指定したデータベース接続文字列から EDMX 接続文字列を生成します。

    open System
    open System.Data
    open System.Data.SqlClient
    open System.Data.EntityClient
    open System.Data.Metadata.Edm
    
    let getEDMConnectionString(dbConnectionString) =
        let dbConnection = new SqlConnection(connectionString)
        let resourceArray = [| "res://*/" |]
        let assemblyList = [| System.Reflection.Assembly.GetCallingAssembly() |]
        let metaData = MetadataWorkspace(resourceArray, assemblyList)
        new EntityConnection(metaData, dbConnection)
    

型プロバイダーの構成

この手順では、EDMX 接続文字列を使用して型プロバイダーを作成および構成し、.edmx ファイルで定義されたスキーマの型を生成します。

型プロバイダーを構成して型を生成するには

  1. このチュートリアルの最初の手順で生成した .edmx ファイルを、プロジェクト フォルダーにコピーします。

  2. F# プロジェクトのプロジェクト ノードのショートカット メニューを開き、[既存項目の追加] を選択し、.edmx ファイルを選択してプロジェクトに追加します。

  3. 次のコードを入力し、.edmx ファイルの型プロバイダーをアクティブにします。Server\Instance を、SQL Server を実行しているサーバーの名前とインスタンスの名前に置き換え、このチュートリアルの最初の手順で生成した .edmx ファイルの名前を使用します。

    type edmx = EdmxFile<"Model1.edmx", ResolutionFolder = @"<folder that contains your .edmx file>>
    
    let edmConnectionString =
        getEDMConnectionString("Data Source=SERVER\instance;Initial Catalog=School;Integrated Security=true;")
    let context = new edmx.SchoolModel.SchoolEntities(edmConnectionString)
    

データの照会

この手順では、F# クエリ式を使用してデータベースを照会します。

データを照会するには

  • エンティティ データ モデルのデータを照会する次のコードを入力します。

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.Person do
            select person }
    |> Seq.iter (fun person -> printfn "%s %s" person.FirstName person.LastName)
    
    // Add a where clause to filter results
    query { for course in context.Courses do
            where (course.DepartmentID = 1)
            select course)
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    // Join two tables
    query { for course in context.Courses do
            join (for dept in context.Departments -> course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

ストアド プロシージャの呼び出し

EDMX 型プロバイダーを使用してストアド プロシージャを呼び出すことができます。次の手順では、列に新しい値を指定してレコードを更新するストアド プロシージャ UpdatePerson が、School データベースに含まれています。このストアド プロシージャは DataContext 型のメソッドとして公開されるため、使用できます。

ストアド プロシージャを呼び出すには

  • 次のコードを追加してレコードを更新します。

    // Call a stored procedure.
    let nullable value = new System.Nullable<_>(value)
    
    // Assume now that you must correct someone's hire date.
    // Throw an exception if more than one matching person is found.
    let changeHireDate(lastName, firstName, hireDate) =
    
        query { for person in context.People do
                where (person.LastName = lastName &&
                       person.FirstName = firstName)
                exactlyOne }
        |> (fun person ->
                context.UpdatePerson(nullable person.PersonID, person.LastName,
                    person.FirstName, nullable hireDate, person.EnrollmentDate))
    
    changeHireDate("Abercrombie", "Kim", DateTime.Parse("1/12/1998"))
    |> printfn "Result: %d"
    

    正常に終了した場合、結果は 1 です。確実に 1 つの結果のみを返すため exactlyOne がクエリ式で使用されています。それ以外の場合は、例外がスローされます。また、null 許容値の操作を簡単にするために、このコードで定義されている単純な nullable 関数を使用し、通常の値から null 許容値を作成できます。

エンティティ データ モデルの構成

この手順は、データベースから完全なエンティティ データ モデルを生成する方法を確認する際に、テストに使用するデータベースがない場合にのみ、完了する必要があります。

エンティティ データ モデルを構成するには

  1. メニュー バーで、[SQL][Transact-SQL エディター][新しいクエリ] の順に選択して、データベースを作成します。プロンプトが表示されたら、データベース サーバーおよびインスタンスを指定します。

  2. Creating the School Sample Database」の説明に従って、Student データベースを作成するデータベース スクリプトの内容をコピーして貼り付けます。

    このチュートリアルの次の手順は、「ADO.NET Entity Data Model Quickstart」に基づいています。

  3. SQL スクリプトを実行するには、三角形の記号が表示されたツール バー ボタンをクリックするか、Ctrl+Q キーを押します。

  4. サーバー エクスプローラーで、[データ接続] のショートカット メニューを開き、[接続の追加] を選択し、データベース サーバーの名前、インスタンスの名前、および School データベースを入力します。

  5. C# または Visual Basic のコンソール アプリケーション プロジェクトを作成し、そのショートカット メニューを開き、[新しい項目の追加] をクリックし、[ADO.NET エンティティ データ モデル] を選択します。

    Entity Data Model ウィザードが開きます。このウィザードを使用すると、エンティティ データ モデルを作成する方法を選択できます。

  6. [モデルのコンテンツの選択] で、[データベースから生成] チェック ボックスをオンにします。

  7. 次のページで、新しく作成された School データベースをデータ接続として選択します。

    この接続は <servername>.<instancename>.School.dbo のようになります。

  8. エンティティ接続文字列は、後で重要となる場合があるため、クリップボードにコピーします。

  9. エンティティの接続文字列を App.Config ファイルに保存するためのチェック ボックスがオンになっていることを確認し、テキスト ボックスの文字列値をメモします。この情報は、必要な場合に接続文字列を検索するときに役立ちます。

  10. 次のページで、[テーブル][ストアド プロシージャ]、および [関数] を選択します。

    これらの最上位ノードを選択すると、すべてのテーブル、ストアド プロシージャ、および関数が選択されます。また、必要に応じて、これらを個別に選択することもできます。

  11. 他の設定のチェック ボックスがオンになっていることを確認します。

    最初の [生成されるオブジェクト名を複数形または単数形にする] チェック ボックスは、データベース テーブルを表すオブジェクトの名前付け規則に一致するように、単数形を複数形に変更するかどうかを示します。[モデルに外部キー列を含める] チェック ボックスは、データベース スキーマについて生成されたオブジェクト型の他のフィールドに結合する目的で、フィールドを含めるかどうかを指定します。3 番目のチェック ボックスは、モデルにストアド プロシージャおよび関数を含めるかどうかを示します。

  12. [完了] をクリックし、School データベースに基づくエンティティ データ モデルを含む .edmx ファイルを生成します。

    ファイル Model1.edmx がプロジェクトに追加され、データベース ダイアグラムが表示されます。

  13. モデルの詳細をすべて表示するには、メニュー バーの [表示][その他のウィンドウ][エンティティ データ モデル ブラウザー] の順にクリックします。また、生成されたオブジェクト モデルがデータベースのテーブルおよび列にどのようにマップされているかを表示するウィンドウを開くには、[エンティティ データ モデル マッピングの詳細] をクリックします。

次の手順

クエリ式 (F#)」に示す使用可能なクエリ演算子を確認して、他のクエリを調べます。

参照

処理手順

チュートリアル : 型プロバイダーおよびエンティティを使用した SQL データベースへのアクセス (F#)

関連項目

EdmxFile 型プロバイダー (F#)

その他の技術情報

型プロバイダー

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)