次の方法で共有


空間 - EF デザイナー

EF5 以降のみ - このページで説明されている機能、API などが Entity Framework 5 で導入されました。 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。

ビデオと詳細なチュートリアルでは、Entity Framework Designer を使用して空間型をマップする方法を示します。 また、LINQ クエリを使用して 2 つの場所間の距離を検索する方法も示します。

このチュートリアルでは、Model First を使用して新しいデータベースを作成しますが、EF Designer を データベース ファースト ワークフローと共に使用して既存のデータベースにマップすることもできます。

空間型のサポートは、Entity Framework 5 で導入されました。 空間型、列挙型、テーブル値関数などの新機能を使用するには、.NET Framework 4.5 をターゲットにする必要があることに注意してください。 Visual Studio 2012 は、既定で .NET 4.5 を対象とします。

空間データ型を使用するには、空間サポートを持つ Entity Framework プロバイダーも使用する必要があります。 詳細については、 空間型のプロバイダーサポート を参照してください。

地理とジオメトリの 2 つの主な空間データ型があります。 geography データ型には、楕円体データ (GPS の緯度座標や経度座標など) が格納されます。 geometry データ型は、ユークリッド幾何学の平面座標系を表します。

ビデオを見る

このビデオでは、Entity Framework デザイナーを使用して空間型をマップする方法について説明します。 また、LINQ クエリを使用して 2 つの場所間の距離を検索する方法も示します。

発表者: Julia Kornich

ビデオ: WMV | MP4 | WMV (ZIP)

前提条件

このチュートリアルを完了するには、Visual Studio 2012、Ultimate、Premium、Professional、または Web Express エディションをインストールする必要があります。

プロジェクトを設定する

  1. Visual Studio 2012 を開く
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. 左側のウィンドウで、[ Visual C#] をクリックし、 コンソール テンプレートを選択します。
  4. プロジェクトの名前として「SpatialEFDesigner」と入力し、[OK] をクリックします。

EF デザイナーを使用して新しいモデルを作成する

  1. ソリューション エクスプローラーでプロジェクト名を右クリックし、[追加] をポイントして、[新しい項目] をクリックします。
  2. 左側のメニューから [データ ] を選択し、[テンプレート] ウィンドウ ADO.NET エンティティ データ モデル を選択します
  3. ファイル名として UniversityModel.edmx を入力し、[追加] をクリックします。
  4. [エンティティ データ モデル ウィザード] ページで、[モデル コンテンツの選択] ダイアログ ボックスで [空 のモデル] を選択します。
  5. [完了] をクリックします。

モデルを編集するためのデザイン 画面を提供するエンティティ デザイナーが表示されます。

ウィザードは、次の操作を実行します。

  • 概念モデル、ストレージ モデル、およびそれらの間のマッピングを定義する EnumTestModel.edmx ファイルを生成します。 生成されたメタデータ ファイルがアセンブリに埋め込まれるように、.edmx ファイルのメタデータ成果物処理プロパティを [出力アセンブリに埋め込む] に設定します。
  • EntityFramework、System.ComponentModel.DataAnnotations、および System.Data.Entity の各アセンブリへの参照を追加します。
  • UniversityModel.tt および UniversityModel.Context.tt ファイルを作成し、.edmx ファイルの下に追加します。 これらの T4 テンプレート ファイルは、.edmx モデルのエンティティにマップされる DbContext 派生型と POCO 型を定義するコードを生成します。

新しいエンティティ型の追加

  1. デザイン サーフェイスの空の領域を右クリックし、[ 追加] -> [エンティティ] を選択すると、[新しいエンティティ] ダイアログ ボックスが表示されます
  2. 型名に University を指定し、キー プロパティ名に UniversityID を指定します。型は Int32 のままにします
  3. 「OK」をクリックして
  4. エンティティを右クリックし、[新規追加] -> スカラー プロパティを選択します。
  5. 新しいプロパティの名前を Name に変更する
  6. 別のスカラー プロパティを追加し、名前を [場所] に変更します。[プロパティ] ウィンドウを開き、新しいプロパティの型を Geography に変更します
  7. モデルを保存してプロジェクトをビルドする

    ビルドすると、マップされていないエンティティと関連付けに関する警告がエラー一覧に表示されることがあります。 モデルからデータベースを生成することを選択するとエラーが解消されるため、これらの警告は無視できます。

モデルからデータベースを生成する

これで、モデルに基づくデータベースを生成できます。

  1. エンティティ デザイナー画面で空の領域を右クリックし、[モデルからデータベースを生成] を選択します。
  2. データベースの生成ウィザードの [データ接続の選択] ダイアログ ボックスが表示されます。[新しい接続] ボタンをクリックしてサーバー名を指定 (localdb)\mssqllocaldb、データベースに University をクリックし、[OK] をクリックします。
  3. 新しいデータベースを作成するかどうかを確認するダイアログボックスが表示されたら、[ はい] をクリックします。
  4. [ 次へ ] をクリックすると、データベースを作成するためのデータ定義言語 (DDL) が生成されます。生成された DDL は、[概要と設定] ダイアログ ボックスに表示されます。DDL には列挙型にマップされるテーブルの定義が含まれていないことに注意してください。
  5. Finish をクリックしても DDL スクリプトは実行されません。
  6. データベースの作成ウィザードでは、次の操作が行われます。T-SQL エディターで UniversityModel.edmx.sql が開き、EDMX ファイルのストア スキーマとマッピング セクションが生成され、接続文字列情報が App.config ファイルに追加されます。
  7. T-SQL エディターでマウスの右ボタンをクリックし、[サーバーへの接続] ダイアログが表示される [実行] を選択し、手順 2 の接続情報を入力して [接続] をクリックします
  8. 生成されたスキーマを表示するには、SQL Server オブジェクト エクスプローラーでデータベース名を右クリックし、[最新の情報に更新] を選択します

データの永続化と取得

Main メソッドが定義されているProgram.cs ファイルを開きます。 Main 関数に次のコードを追加します。

このコードは、2 つの新しい University オブジェクトをコンテキストに追加します。 空間プロパティは、DbGeography.FromText メソッドを使用して初期化されます。 WellKnownText として表される geography ポイントがメソッドに渡されます。 その後、コードによってデータが保存されます。 次に、指定した場所に最も近い場所にある University オブジェクトを返す LINQ クエリが構築され、実行されます。

using (var context = new UniversityModelContainer())
{
    context.Universities.Add(new University()
    {
        Name = "Graphic Design Institute",
        Location = DbGeography.FromText("POINT(-122.336106 47.605049)"),
    });

    context.Universities.Add(new University()
    {
        Name = "School of Fine Art",
        Location = DbGeography.FromText("POINT(-122.335197 47.646711)"),
    });

    context.SaveChanges();

    var myLocation = DbGeography.FromText("POINT(-122.296623 47.640405)");

    var university = (from u in context.Universities
                                orderby u.Location.Distance(myLocation)
                                select u).FirstOrDefault();

    Console.WriteLine(
        "The closest University to you is: {0}.",
        university.Name);
}

アプリケーションをコンパイルして実行します。 このプログラムの出力は、次のようになります。

The closest University to you is: School of Fine Art.

データベース内のデータを表示するには、SQL Server オブジェクト エクスプローラーでデータベース名を右クリックし、[ 最新の情報に更新] を選択します。 次に、テーブルの右マウス ボタンをクリックし、[ データの表示] を選択します。

まとめ

このチュートリアルでは、Entity Framework Designer を使用して空間型をマップする方法と、コードで空間型を使用する方法について説明しました。