Entity Framework Code First (七)空間數據類型 Spatial Data Types


  聲明:本文針對 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM