通过


空间 - 代码优先

注释

仅限 EF5 - 本页中讨论的功能、API 等是在实体框架 5 中首次引入的。 如果使用早期版本,某些或全部信息不适用。

视频和分步演练演示如何使用 Entity Framework Code First 映射空间类型。 它还演示如何使用 LINQ 查询查找两个位置之间的距离。

本演练将使用 Code First 创建新数据库,但也可以将 Code First 用于现有数据库

实体框架 5 中引入了空间类型支持。 请注意,若要使用空间类型、枚举和表值函数等新功能,必须面向 .NET Framework 4.5。 默认情况下,Visual Studio 2012 面向 .NET 4.5。

若要使用空间数据类型,还必须使用具有空间支持的 Entity Framework 提供程序。 有关详细信息,请参阅 提供程序对空间类型的支持

有两个主要的空间数据类型:地理和几何图形。 地理数据类型存储椭圆形数据(例如 GPS 纬度和经度坐标)。 几何数据类型表示 Euclidean (平面) 坐标系。

观看视频

此视频演示如何使用 Entity Framework Code First 映射空间类型。 它还演示如何使用 LINQ 查询查找两个位置之间的距离。

作者:朱莉娅·科尔尼奇

视频WMV | MP4 | WMV (ZIP)

先决条件

需要安装 Visual Studio 2012、Ultimate、Premium、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 的地理点将传递给该方法。 然后,代码保存数据。 然后,构造并执行一个 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 迁移到新数据库

若要查看数据库和数据,请执行以下操作:

  1. 在 Visual Studio 2012 主菜单中,选择 “视图 ->SQL Server 对象资源管理器”。
  2. 如果 LocalDB 不在服务器列表中,请单击 SQL Server 上的鼠标右键并选择 “添加 SQL Server 使用默认 Windows 身份验证 连接到 LocalDB 实例”
  3. 展开 LocalDB 节点
  4. 展开 “数据库” 文件夹以查看新数据库并浏览到 “大学 ”表
  5. 若要查看数据,请右键单击表,然后选择“ 查看数据”

总结

在本演练中,我们介绍了如何将空间类型与 Entity Framework Code First 配合使用。