空間 - 程式碼優先

注意

僅限 EF5 及更新版本 - 在 Entity Framework 5 中已介紹此頁面所討論的功能、API 等。 如果您使用的是較早版本,則不適用部分或全部的資訊。

影片和逐步解說示範如何使用 Entity Framework Code First 對應空間類型。 它也示範如何使用 LINQ 查詢來尋找兩個位置之間的距離。

本逐步解說會使用 Code First 來建立新的資料庫,但您也可以使用 Code First 到現有的資料庫

Entity Framework 5 引進了空間類型支援。 請注意,若要使用空間類型、列舉和資料表值函式等新功能,您必須以 .NET Framework 4.5 為目標。 Visual Studio 2012 預設會以 .NET 4.5 為目標。

若要使用空間資料類型,您也必須使用具有空間支援的 Entity Framework 提供者。 如需詳細資訊,請參閱 空間類型的 提供者支援。

有兩個主要的空間資料類型:geography 和 geometry。 geography 資料類型會儲存橢圓體資料(例如 GPS 緯度和經度座標)。 geometry 資料類型代表 Euclidean (平面) 座標系統。

觀賞影片

這段影片示範如何使用 Entity Framework Code First 對應空間類型。 它也示範如何使用 LINQ 查詢來尋找兩個位置之間的距離。

呈現者 :朱麗亞·科尼奇

影片 WMV | MP4 | WMV (ZIP)

必要條件

您必須安裝 Visual Studio 2012、Ultimate、進階版、Professional 或 Web Express 版本,才能完成本逐步解說。

設定專案

  1. 開啟 Visual Studio 2012
  2. 在 [ 檔案] 功能表上,指向 [ 新增 ],然後按一下 [ 專案]
  3. 在左窗格中,按一下 [Visual C# ],然後選取 主控台 範本
  4. 輸入 SpatialCodeFirst 作為專案的名稱,然後按一下 [ 確定]

使用 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 函式。

程式碼會將兩個新的 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 移轉來更新資料庫架構。 如需使用移轉的範例,請參閱 Code First to a New Database

若要檢視資料庫和資料,請執行下列動作:

  1. 在 Visual Studio 2012 主功能表中,選取 [檢視 - > SQL Server 物件總管 ]。
  2. 如果 LocalDB 不在伺服器清單中,請按一下 SQL Server 上的 滑鼠右鍵,然後選取 [ 新增 SQL Server 使用預設 Windows 驗證 連線到 LocalDB 實例]
  3. 展開 LocalDB 節點
  4. 展開 [ 資料庫] 資料夾以查看新的資料庫,並流覽至 [大學] 資料表
  5. 若要檢視資料,請以滑鼠右鍵按一下資料表,然後選取 [ 檢視資料]

摘要

在本逐步解說中,我們探討如何搭配 Entity Framework Code First 使用空間類型。