空間 Code FirstSpatial - Code First

注意

EF5 以降: このページで説明した機能、api などは、Entity Framework 5 で導入されました。EF5 Onwards Only - The features, APIs, etc. discussed in this page were introduced in Entity Framework 5. 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。If you are using an earlier version, some or all of the information does not apply.

ビデオとステップバイステップのチュートリアルでは、空間型を Entity Framework Code First にマップする方法について説明します。The video and step-by-step walkthrough shows how to map spatial types with Entity Framework Code First. また、LINQ クエリを使用して2つの場所の間の距離を検索する方法も示します。It also demonstrates how to use a LINQ query to find a distance between two locations.

このチュートリアルでは Code First を使用して新しいデータベースを作成しますが、 既存のデータベースに Code First を使用することもできます。This walkthrough will use Code First to create a new database, but you can also use Code First to an existing database.

空間型のサポートは Entity Framework 5 で導入されました。Spatial type support was introduced in Entity Framework 5. 空間型、列挙型、テーブル値関数などの新機能を使用するには、.NET Framework 4.5 をターゲットにする必要があることに注意してください。Note that to use the new features like spatial type, enums, and Table-valued functions, you must target .NET Framework 4.5. 既定では、Visual Studio 2012 は .NET 4.5 を対象としています。Visual Studio 2012 targets .NET 4.5 by default.

空間データ型を使用するには、空間をサポートする Entity Framework プロバイダーも使用する必要があります。To use spatial data types you must also use an Entity Framework provider that has spatial support. 詳細については、「 プロバイダーによる空間型のサポート 」を参照してください。See provider support for spatial types for more information.

主な空間データ型には、geography と geometry の2つがあります。There are two main spatial data types: geography and geometry. Geography データ型には、楕円体データ (GPS の緯度や経度の座標など) が格納されます。The geography data type stores ellipsoidal data (for example, GPS latitude and longitude coordinates). Geometry データ型は、ユークリッド (平面) 座標系を表します。The geometry data type represents Euclidean (flat) coordinate system.

ビデオを見るWatch the video

このビデオでは、空間型を Entity Framework Code First にマップする方法について説明します。This video shows how to map spatial types with Entity Framework Code First. また、LINQ クエリを使用して2つの場所の間の距離を検索する方法も示します。It also demonstrates how to use a LINQ query to find a distance between two locations.

表示者: ジュリアついPresented By: Julia Kornich

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

前提条件Pre-Requisites

このチュートリアルを完了するには、Visual Studio 2012、Ultimate、Premium、Professional、または Web Express エディションがインストールされている必要があります。You will need to have Visual Studio 2012, Ultimate, Premium, Professional, or Web Express edition installed to complete this walkthrough.

プロジェクトを設定するSet up the Project

  1. Visual Studio 2012 を開くOpen Visual Studio 2012
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。On the File menu, point to New, and then click Project
  3. 左側のウィンドウで、[ **Visual C # **] をクリックし、コンソールテンプレートを選択します。In the left pane, click Visual C#, and then select the Console template
  4. プロジェクトの名前として「 SpatialCodeFirst 」と入力し、[ OK] をクリックします。Enter SpatialCodeFirst as the name of the project and click OK

Code First を使用して新しいモデルを定義するDefine a New Model using Code First

Code First 開発を使用する場合は、通常、概念 (ドメイン) モデルを定義する .NET Framework クラスを記述することから始めます。When using Code First development you usually begin by writing .NET Framework classes that define your conceptual (domain) model. 次のコードは、大学クラスを定義しています。The code below defines the University class.

この大学は、DbGeography 型の Location プロパティを持っています。The University has the Location property of the DbGeography type. DbGeography 型を使用するには、system.string アセンブリへの参照を追加し、さらに、system.string using ステートメントも追加する必要があります。To use the DbGeography type, you must add a reference to the System.Data.Entity assembly and also add the System.Data.Spatial using statement.

Program.cs ファイルを開き、次の using ステートメントをファイルの先頭に貼り付けます。Open the Program.cs file and paste the following using statements at the top of the file:

using System.Data.Spatial;

次の大学クラス定義を Program.cs ファイルに追加します。Add the following University class definition to the Program.cs file.

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

DbContext の派生型を定義するDefine the DbContext Derived Type

エンティティを定義するだけでなく、DbContext から派生して DbSet<TEntity> プロパティを公開するクラスを定義する必要があります。In addition to defining entities, you need to define a class that derives from DbContext and exposes DbSet<TEntity> properties. DbSet<TEntity> プロパティにより、モデルに含める型をコンテキストに認識させることができます。The DbSet<TEntity> properties let the context know which types you want to include in the model.

DbContext の派生型のインスタンスによって、実行時にエンティティ オブジェクトが管理されます。これには、オブジェクトへのデータベースのデータの設定、変更の追跡、データベースへのデータの保持が含まれます。An instance of the DbContext derived type manages the entity objects during run time, which includes populating objects with data from a database, change tracking, and persisting data to the database.

DbContext および Dbcontext 型は EntityFramework アセンブリで定義されています。The DbContext and DbSet types are defined in the EntityFramework assembly. ここでは、EntityFramework NuGet パッケージを使用して、この DLL への参照を追加します。We will add a reference to this DLL by using the EntityFramework NuGet package.

  1. ソリューションエクスプローラーで、プロジェクト名を右クリックします。In Solution Explorer, right-click on the project name.
  2. [ NuGet パッケージの管理... ] を選択します。Select Manage NuGet Packages…
  3. [NuGet パッケージの管理] ダイアログで、[ オンライン ] タブを選択し、 entityframework パッケージを選択します。In the Manage NuGet Packages dialog, Select the Online tab and choose the EntityFramework package.
  4. [Install] (インストール) をクリックします。Click Install

EntityFramework アセンブリに加えて、System.componentmodel アセンブリへの参照も追加されることに注意してください。Note, that in addition to the EntityFramework  assembly, a reference to the System.ComponentModel.DataAnnotations assembly is also added.

Program.cs ファイルの先頭に、次の using ステートメントを追加します。At the top of the Program.cs file, add the following using statement:

using System.Data.Entity;

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

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

データの永続化と取得Persist and Retrieve Data

Main メソッドが定義されている Program.cs ファイルを開きます。Open the Program.cs file where the Main method is defined. Main 関数に次のコードを追加します。Add the following code into the Main function.

このコードでは、2つの新しい大学オブジェクトをコンテキストに追加します。The code adds two new University objects to the context. 空間プロパティは、FromText メソッドを使用して初期化されます。Spatial properties are initialized by using the DbGeography.FromText method. WellKnownText として表される geography ポイントがメソッドに渡されます。The geography point represented as WellKnownText is passed to the method. 次に、データを保存します。The code then saves the data. 次に、指定した場所に最も近い大学オブジェクトを返す LINQ クエリを構築して実行します。Then, the LINQ query that that returns a University object where its location is closest to the specified location, is constructed and executed.

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);
}

アプリケーションをコンパイルして実行します。Compile and run the application. このプログラムの出力は、次のようになります。The program produces the following output:

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

生成されたデータベースを表示するView the Generated Database

アプリケーションを初めて実行すると、Entity Framework によってデータベースが作成されます。When you run the application the first time, the Entity Framework creates a database for you. Visual Studio 2012 がインストールされているため、データベースは LocalDB インスタンス上に作成されます。Because we have Visual Studio 2012 installed, the database will be created on the LocalDB instance. 既定では、Entity Framework は、派生コンテキストの完全修飾名 (この例では UniversityContext) の後にデータベースに名前を付けます。By default, the Entity Framework names the database after the fully qualified name of the derived context (in this example that is SpatialCodeFirst.UniversityContext). その後、既存のデータベースが使用されます。The subsequent times the existing database will be used.  

データベースの作成後にモデルに変更を加えた場合は、Code First Migrations を使用してデータベーススキーマを更新する必要があることに注意してください。Note, that if you make any changes to your model after the database has been created, you should use Code First Migrations to update the database schema. 移行の使用例については 、「新しいデータベースへの Code First 」を参照してください。See Code First to a New Database for an example of using Migrations.

データベースとデータを表示するには、次の手順を実行します。To view the database and data, do the following:

  1. Visual Studio 2012 のメインメニューで、[SQL Server オブジェクトエクスプローラーの表示] を選択し - > SQL Server Object Explorerます。In the Visual Studio 2012 main menu, select View -> SQL Server Object Explorer.
  2. LocalDB がサーバーの一覧にない場合は、 SQL Server で右マウスボタンをクリックし、[追加] を選択 SQL Server 既定の Windows 認証 を使用して localdb インスタンスに接続します。If LocalDB is not in the list of servers, click the right mouse button on SQL Server and select Add SQL Server Use the default Windows Authentication to connect to the the LocalDB instance
  3. LocalDB ノードを展開します。Expand the LocalDB node
  4. [ データベース ] フォルダーを展開して新しいデータベースを表示し、[ 大学 ] テーブルを参照します。Unfold the Databases folder to see the new database and browse to the Universities table
  5. データを表示するには、テーブルを右クリックし、[データの表示] を選択します。To view data, right-click on the table and select View Data

まとめSummary

このチュートリアルでは、Entity Framework Code First で空間型を使用する方法について説明しました。In this walkthrough we looked at how to use spatial types with Entity Framework Code First.