空間 - Code First

Note

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

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

このチュートリアルでは、Code First を使用して新しいデータベースを作成しますが、Code First を使用して既存のデータベースをターゲットにすることもできます。

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

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

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

ビデオを見る

このビデオには、Entity Framework Code First を使用して空間型をマップする方法が示されています。 また、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. プロジェクトの名前として「SpatialCodeFirst」と入力し、[OK] をクリックします

Code First を使用して新しいモデルを定義する

通常、Code First の開発を使用するときはまず、概念 (ドメイン) モデルを定義する .NET Framework のクラスを記述します。 次のコードでは、University クラスを定義しています。

University には、DbGeography 型の Location プロパティがあります。 DbGeography 型を使用するには、System.Data.Entity アセンブリへの参照を追加し、さらに System.Data.Spatial using ステートメントも追加する必要があります。

Program.cs ファイルを開き、次の using ステートメントをファイルの先頭に貼り付けます。

using System.Data.Spatial;

次の University クラス定義を Program.cs ファイルに追加します。

public class University  
{
    public int UniversityID { get; set; }
    public string Name { get; set; }
    public DbGeography Location { get; set; }
}

DbContext の派生型を定義する

エンティティを定義するだけでなく、DbContext から派生して DbSet<TEntity> プロパティを公開するクラスを定義する必要があります。 DbSet<TEntity> プロパティにより、モデルに含める型をコンテキストに認識させることができます。

DbContext の派生型のインスタンスによって、実行時にエンティティ オブジェクトが管理されます。これには、オブジェクトへのデータベースのデータの設定、変更の追跡、データベースへのデータの保持が含まれます。

DbContext および DbSet 型は EntityFramework アセンブリで定義されています。 EntityFramework NuGet パッケージを使用して、この DLL への参照を追加します。

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックします。
  2. [NuGet パッケージの管理] を選択します
  3. [NuGet パッケージの管理] ダイアログで [オンライン] タブを選択し、[EntityFramework] パッケージを選択します。
  4. [インストール]をクリックします。

EntityFramework アセンブリに加えて、System.ComponentModel.DataAnnotations アセンブリへの参照も追加されることに注意してください。

Program.cs ファイルの先頭に、次の using ステートメントを追加します。

using System.Data.Entity;

Program.cs で、コンテキスト定義を追加します。 

public partial class UniversityContext : DbContext
{
    public DbSet<University> Universities { get; set; }
}

データの永続化と取得

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

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

using (var context = new UniversityContext ())
{
    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.

生成されたデータを表示する

アプリケーションを初めて実行すると、Entity Framework によって自動的にデータベースが作成されます。 Visual Studio 2012 をインストールしているため、データベースは LocalDB インスタンス上に作成されます。 既定では、Entity Framework によって、派生コンテキストの完全修飾名に基づいてデータベースに名前が付けられます (この例では SpatialCodeFirst.UniversityContext となります)。 その後は、この既存のデータベースが使用されます。  

データベースの作成後にモデルに変更を加えた場合は、Code First Migrations を使用してデータベース スキーマを更新する必要があることに注意してください。 Migrations の使用例については、「新しいデータベースへの Code First」を参照してください。

データベースとデータを表示するには、次の手順を実行します。

  1. Visual Studio 2012 のメイン メニューで、[表示] ->[SQL Server オブジェクト エクスプローラー] を選択します。
  2. LocalDB がサーバーの一覧に表示されていない場合は、[SQL Server] でマウスの右ボタンをクリックし、[SQL Server の追加] を選択します 既定の Windows 認証を使用して、LocalDB インスタンスに接続します
  3. [LocalDB] ノードを展開します
  4. [データベース] フォルダーを展開して新しいデータベースを表示し、[Universities] テーブルを参照します
  5. データを表示するには、テーブルを右クリックし、[データの表示] を選択します

まとめ

このチュートリアルでは、Entity Framework Code First で空間型を使用する方法について説明しました。