空間 - 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
前提条件
このチュートリアルを完了するには、Visual Studio 2012、Ultimate、Premium、Professional、または Web Express エディションがインストールされている必要があります。
プロジェクトをセットアップする
- Visual Studio 2012 を開きます
- [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします
- 左ペインで [Visual C#] をクリックし、[コンソール] テンプレートを選択します
- プロジェクトの名前として「SpatialEFDesigner」と入力し、[OK] をクリックします
EF Designer を使用して新しいモデルを作成する
- ソリューション エクスプローラーで、プロジェクト名を右クリックして [追加] をポイントし、[新しい項目] をクリックします
- 左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します
- ファイル名として「UniversityModel.edmx」と入力し、[追加] をクリックします
- [Entity Data Model ウィザード] ページの [モデルのコンテンツの選択] ダイアログ ボックスで、[空のモデル] を選択します
- [完了] をクリックします。
モデルを編集するためのデザイン サーフェイスを提供する Entity Designer が表示されます。
ウィザードは、次のアクションを実行します。
- 概念モデル、ストレージ モデル、およびこれらのモデル間のマッピングを定義する EnumTestModel.edmx ファイルを生成します。 生成されたメタデータ ファイルがアセンブリに埋め込まれるように、.edmx ファイルの [メタデータ成果物の処理] プロパティを [出力アセンブリに埋め込む] に設定します。
- EntityFramework、System.ComponentModel.DataAnnotations、および System.Data.Entity の各アセンブリへの参照を追加します。
- UniversityModel.tt および UniversityModel.Context.tt ファイルを作成し、.edmx ファイルの下に追加します。 これらの T4 テンプレート ファイルによって、.edmx モデル内のエンティティにマップされる DbContext 派生型および POCO 型を定義するコードが生成されます
新しいエンティティ型を追加する
- デザイン画面の空の領域を右クリックし、[追加 ] -> [エンティティ] を選択すると、[新しいエンティティ] ダイアログ ボックスが表示されます
- 型名として「University」を指定し、キー プロパティ名として「UniversityID」を指定します。型は [Int32] のままにします
- OK をクリックします
- エンティティを右クリックし、[新規追加] -> [スカラー プロパティ] を選択します
- 新しいプロパティの名前を「Name」に変更します
- 別のスカラー プロパティを追加し、その名前を「Location」に変更します。プロパティ ウィンドウを開き、新しいプロパティの型を「Geography」に変更します
- モデルを保存し、プロジェクトをビルドします
Note
ビルドすると、マップされていないエンティティと関連付けについての警告が [エラー一覧] に表示される場合があります。 モデルからデータベースを生成することを選択すると、エラーが解消されるため、これらの警告は無視してかまいません。
モデルからデータベースを生成する
これで、モデルに基づいたデータベースを生成できます。
- エンティティ デザイナー画面で空の領域を右クリックし、[モデルからのデータベース生成] を選択します
- データベース生成ウィザードの [データ接続の選択] ダイアログ ボックスが表示されます [新しい接続] ボタンをクリックします サーバー名として「(localdb)\mssqllocaldb」を指定し、データベースとして「University」を指定して、[OK] をクリックします
- 新しいデータベースを作成することを確認するダイアログが表示されたら、[はい] をクリックします。
- [次へ] をクリックすると、データベース作成ウィザードによって、データベースを作成するためのデータ定義言語 (DDL) が生成されます 生成された DDL は [概要と構成] ダイアログ ボックスに表示されます DDL には、列挙型にマップされるテーブルの定義は含まれていないことに注意してください
- [完了] をクリックします [完了] をクリックしても、DDL スクリプトは実行されません。
- データベース作成ウィザードでは、次の手順を実行します。T-SQL エディターで UniversityModel.edmx.sql を開きます EDMX ファイルのストア スキーマおよびマッピング セクションを生成します 接続文字列情報を App.config ファイルに追加します
- T-SQL エディターでマウスの右ボタンをクリックし、[実行] を選択します [サーバーへ接続] ダイアログが表示されたら、手順 2. の接続情報を入力し、[接続] をクリックします
- 生成されたスキーマを表示するには、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 を使用して空間型をマップする方法と、コードで空間型を使用する方法について説明しました。
.NET