次の方法で共有


空間 - コードファースト

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 プロバイダーも使用する必要があります。 詳細については、 空間型のプロバイダーサポート を参照してください。

地理とジオメトリの 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 クラスを定義します。

大学には、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 として表される geography ポイントがメソッドに渡されます。 その後、コードによってデータが保存されます。 次に、指定した場所に最も近い場所にある 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 を使用してデータベース スキーマを更新する必要があることに注意してください。 移行の使用例については、「 新しいデータベースへのコードファースト 」を参照してください。

データベースとデータを表示するには、次の操作を行います。

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

まとめ

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