訓練
空間 - 程式碼優先
注意
僅限 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 查詢來尋找兩個位置之間的距離。
呈現者 :朱麗亞·科尼奇
您必須安裝 Visual Studio 2012、Ultimate、進階版、Professional 或 Web Express 版本,才能完成本逐步解說。
- 開啟 Visual Studio 2012
- 在 [ 檔案] 功能表上,指向 [ 新增 ],然後按一下 [ 專案]
- 在左窗格中,按一下 [Visual C# ],然後選取 主控台 範本
- 輸入 SpatialCodeFirst 作為專案的名稱,然後按一下 [ 確定]
使用 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 的類別,並公開 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 函式。
程式碼會將兩個新的 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 。
若要檢視資料庫和資料,請執行下列動作:
- 在 Visual Studio 2012 主功能表中,選取 [檢視 - > SQL Server 物件總管 ]。
- 如果 LocalDB 不在伺服器清單中,請按一下 SQL Server 上的 滑鼠右鍵,然後選取 [ 新增 SQL Server 使用預設 Windows 驗證 連線到 LocalDB 實例]
- 展開 LocalDB 節點
- 展開 [ 資料庫] 資料夾以查看新的資料庫,並流覽至 [大學] 資料表
- 若要檢視資料,請以滑鼠右鍵按一下資料表,然後選取 [ 檢視資料]
在本逐步解說中,我們探討如何搭配 Entity Framework Code First 使用空間類型。
其他資源
文件
-
Entity Framework 6 中的程式代碼第一個慣例
-
列舉支援 - Entity Framework 6 中的程式碼優先
-
在 Entity Framework 6 中定義 DbSet