聲明:本文針對 EF5+, Visual Studio 2012+
空間數據類型(Spatial Data Types)是在 EF5 中引入的,空間數據類型表現有兩種:
- Geography (地理學上的)- 存儲的是橢圓形數據,如 GPS 的經緯度坐標;
- Geometry (幾何學上的)- 代表歐氏幾何(平面的)坐標系統。
下面示例該數據類型的一個應用程序
新建 C# 控制台應用程序
相信 Console 應該都會建,命名為 SpatialCodeFirst
使用 Code First 建立 Model
注意為 DbGeography 添加 System.Data.Entity.Spatial 命名空間
public class University { public int UniversityID { get; set; } public string Name { get; set; } public DbGeography Location { get; set; } }
定義DbContext 的派生類型
先要安裝 Entity Framework (請參考 http://www.cnblogs.com/panchunting/p/creating-an-entity-framework-data-model-for-an-asp-net-mvc-application.html)
注意添加命名空間 System.Data.Entity, System.Data.Entity.ModelConfiguration.Conventions
class UniversityContext : DbContext { public UniversityContext() : base("UniversityContext") { } public DbSet<University> Universities { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } }
定義UniversityInitializer
注意添加命名空間 System.Data.Entity, System.Data.Entity.Spatial
class UniversityInitializer : DropCreateDatabaseIfModelChanges<UniversityContext> { protected override void Seed(UniversityContext context) { var universities = new List<University>() { new University { Name = "Graphic Design Institute", Location = DbGeography.FromText("POINT(-122.336106 47.605049)") }, new University { Name = "School of Fine Art", Location = DbGeography.FromText("POINT(-122.335197 47.646711)") } }; universities.ForEach(s => context.Universities.Add(s)); context.SaveChanges(); } }
配置App.config
注意黃色高亮部分,第一部分為配置數據庫連接(使用 LocalDB ),第二部分為配置說明使用的 DbContext 及其初始化器
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="UniversityContext" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=SpatialCodeFirst;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <entityFramework> <contexts> <context type="SpatialCodeFirst.UniversityContext, SpatialCodeFirst"> <databaseInitializer type="SpatialCodeFirst.UniversityInitializer, SpatialCodeFirst" /> </context> </contexts> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> </configuration>
在 Program.cs 添加代碼調用
class Program { static void Main(string[] args) { using (var context = new UniversityContext()) { 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); Console.ReadKey(); } } }
運行查看結果
后台數據庫定義
表中數據
(localdb)\v11.0不在列表中
右擊新建 Connection 即可
原文:http://msdn.microsoft.com/en-us/data/hh859721