空间 - Code First

注意

仅限 EF5 及更高版本 - 此页面中讨论的功能、API 等已引入实体框架 5。 如果使用的是早期版本,则部分或全部信息不适用。

本视频和分步演练介绍如何使用实体框架 Code First 映射空间类型。 它还演示如何使用 LINQ 查询查找两个位置之间的距离。

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

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

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

有两种主要的空间数据类型:地理和几何。 地理数据类型存储椭球体数据(例如 GPS 纬度和经度坐标)。 几何数据类型表示欧几里得(平面)坐标系。

观看视频

本视频介绍如何使用实体框架 Code First 映射空间类型。 它还演示如何使用 LINQ 查询查找两个位置之间的距离。

主讲人:Julia Kornich

视频WMV | MP4 | WMV (ZIP)

先决条件

需要安装 Visual Studio 2012、Ultimate、Premium、Professional 或 Web Express Edition 才能完成本演练。

设置项目

  1. 打开 Visual Studio 2012
  2. 在“文件”菜单上指向“新建”,然后单击“项目”
  3. 在左侧窗格中,单击“Visual C#”,然后选择“控制台”模板
  4. 输入 SpatialCodeFirst 作为项目名称,然后单击“确定”

使用 Code First 定义新模型

使用 Code First 开发时,通常先编写定义概念(域)模型的 .NET Framework 类。 下面的代码定义了 University 类。

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; }
}

保留和检索数据

打开 Program.cs 文件,其中定义了 Main 方法。 将以下代码添加到 Main 函数中。

该代码会将两个新的 University 对象添加到上下文中。 空间属性使用 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 迁移来更新数据库架构。 有关使用迁移的示例,请参阅对新数据库使用 Code First

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

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

总结

在本演练中,我们研究了如何通过实体框架 Code First 使用空间类型。