空間 - EF Designer

Note

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

ビデオとステップバイステップのチュートリアルでは、Entity Framework Designer を使用して空間型をマップする方法について説明します。 また、LINQ クエリを使用して 2 つの場所の距離を確認する方法も示されています。

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

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

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

主な空間データ型としては、geography と geometry の 2 つがあります。 geography データ型は、楕円体データを格納します (GPS の緯度経度座標など)。 geometry データ型は、ユークリッド (平面) 座標系を表します。

ビデオを見る

このビデオには、Entity Framework Designer を使用して空間型をマップする方法が示されています。 また、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 Designer を使用して新しいモデルを作成する

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

モデルを編集するためのデザイン サーフェイスを提供する Entity Designer が表示されます。

ウィザードは、次のアクションを実行します。

  • 概念モデル、ストレージ モデル、およびこれらのモデル間のマッピングを定義する 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. 別のスカラー プロパティを追加し、その名前を「Location」に変更します。プロパティ ウィンドウを開き、新しいプロパティの型を「Geography」に変更します
  7. モデルを保存し、プロジェクトをビルドします

    Note

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

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

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

  1. エンティティ デザイナー画面で空の領域を右クリックし、[モデルからのデータベース生成] を選択します
  2. データベース生成ウィザードの [データ接続の選択] ダイアログ ボックスが表示されます [新しい接続] ボタンをクリックします サーバー名として「(localdb)\mssqllocaldb」を指定し、データベースとして「University」を指定して、[OK] をクリックします
  3. 新しいデータベースを作成することを確認するダイアログが表示されたら、[はい] をクリックします。
  4. [次へ] をクリックすると、データベース作成ウィザードによって、データベースを作成するためのデータ定義言語 (DDL) が生成されます 生成された DDL は [概要と構成] ダイアログ ボックスに表示されます DDL には、列挙型にマップされるテーブルの定義は含まれていないことに注意してください
  5. [完了] をクリックします [完了] をクリックしても、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 として表される地理的ポイントがメソッドに渡されます。 次に、コードによってデータが保存されます。 次に、指定した場所に最も近い 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 を使用して空間型をマップする方法と、コードで空間型を使用する方法について説明しました。