注
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
前提条件
このチュートリアルを完了するには、Visual Studio 2012、Ultimate、Premium、Professional、または Web Express エディションをインストールする必要があります。
プロジェクトを設定する
- Visual Studio 2012 を開く
- [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
- 左側のウィンドウで、[ Visual C#] をクリックし、 コンソール テンプレートを選択します。
- プロジェクトの名前として「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 への参照を追加します。
- ソリューション エクスプローラーで、プロジェクト名を右クリックします。
- [ NuGet パッケージの管理]を選択します。..
- [NuGet パッケージの管理] ダイアログで、[ オンライン ] タブを選択し、 EntityFramework パッケージを選択します。
- [インストール]をクリックします。
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 を使用してデータベース スキーマを更新する必要があることに注意してください。 移行の使用例については、「 新しいデータベースへのコードファースト 」を参照してください。
データベースとデータを表示するには、次の操作を行います。
- Visual Studio 2012 のメイン メニューで、[ 表示 ] ->SQL サーバー オブジェクト エクスプローラーを選択します。
- LocalDB がサーバーの一覧にない場合は、 SQL Server の右マウス ボタンをクリックし、[ SQL Server の追加 ] を選択します。既定の Windows 認証 を使用して LocalDB インスタンスに接続します
- LocalDB ノードを展開する
- [ データベース ] フォルダーを展開して新しいデータベースを表示し、[ 大学 ] テーブルを参照します。
- データを表示するには、テーブルを右クリックし、[データの表示] を選択します。
まとめ
このチュートリアルでは、Entity Framework Code First で空間型を使用する方法について説明しました。
.NET