空間 - 代碼優先

備註

僅限 EF5 及以後 - 本頁討論的功能、API 等皆於 Entity Framework 5 中引入。 如果你使用的是較早期版本,部分或全部資訊可能不適用。

影片與逐步教學展示了如何使用 Entity Framework Code First 映射空間類型。 同時也示範如何使用 LINQ 查詢來尋找兩個地點之間的距離。

這個教學會使用 Code First 建立一個新的資料庫,但你也可以用 Code First 來建立現有的資料庫

空間型別支援是在 Entity Framework 5 中引入的。 請注意,要使用像空間型別、枚舉和 Table-value 函式等新功能,必須針對 .NET Framework 4.5。 Visual Studio 2012 預設是針對 .NET 4.5。

要使用空間資料型別,你也必須使用具備空間支援的 Entity Framework 提供者。 更多資訊請參閱 空間類型的提供者支援

主要有兩種空間資料類型:地理資料與幾何資料。 地理資料類型儲存橢球體資料(例如 GPS 緯度與經度座標)。 幾何資料類型代表歐幾里得(平面)座標系。

觀看影片

這支影片展示了如何使用 Entity Framework Code First 來繪製空間類型。 同時也示範如何使用 LINQ 查詢來尋找兩個地點之間的距離。

主持人:茱莉亞·科尼奇

影片WMV | MP4 | WMV(ZIP)

先決條件

您需要安裝 Visual Studio 2012、Ultimate、Premium、Professional,或 Web Express 版本才能完成此攻略。

設定專案

  1. Open Visual Studio 2012
  2. 檔案 選單中,指向 「新建」,然後點 選專案
  3. 在左側窗格點選 Visual C#,然後選擇 Console 範本
  4. 輸入 SpatialCodeFirst 作為專案名稱並點擊 確定

先用程式碼定義新模型

使用 Code First 開發時,通常會先撰寫 .NET Framework 類別來定義你的概念(領域)模型。 以下程式碼定義了大學類別。

大學擁有 DbGeography 類型的 Location 屬性。 要使用 DbGeography 類型,你必須加入 System.Data.Entity 組合的參考,並且還要加入 System.Data.Spatial using 的陳述式。

打開 Program.cs 檔案,並用檔案頂端的語句貼上以下內容:

using System.Data.Spatial;

請在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 函式。

程式碼新增了兩個大學物件。 空間屬性透過 DbGeography.FromText 方法初始化。 以 WellKnownText 表示的地理點會傳遞給方法。 程式碼會儲存資料。 接著,會建構並執行一個 LINQ 查詢,此查詢會返回一個位置最接近指定位置的 University 物件。

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.

查看已產生的資料庫

當你第一次執行應用程式時,實體框架會幫你建立一個資料庫。 因為我們安裝了 Visual Studio 2012,資料庫會在 LocalDB 實例上建立。 預設情況下,實體框架會以導出上下文的完全限定名稱命名資料庫(此例中為 SpatialCodeFirst.UniversityContext)。 接下來的次數將使用現有資料庫。  

請注意,如果你在資料庫建立後對模型做任何變更,應該使用 Code First Migrations 來更新資料庫結構。 請參見 「Code First to a New Database 」,了解如何使用遷移。

要查看資料庫與資料,請執行以下操作:

  1. 在 Visual Studio 2012 主選單中,選擇 「檢視 ->SQL Server 物件總管」。
  2. 如果 LocalDB 不在伺服器列表中,請在 SQL Server 上點擊滑鼠右鍵並選擇 新增 SQL Server 。使用預設 的 Windows 認證 來連接 LocalDB 實例
  3. 展開 LocalDB 節點
  4. 展開 Databases 資料夾即可查看新資料庫,並瀏覽至 Universities 表格
  5. 要查看資料,請在表格上右鍵點擊並選擇 「檢視資料」

總結

在這次的教學中,我們探討了如何使用 Entity Framework Code First 的空間型別。