空间 - EF Designer

注释

仅限 EF5 及更高版本 - 此页面中讨论的功能、API 等已引入 Entity Framework 5。 如果使用早期版本,某些或全部信息不适用。

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

本演练将使用 Model First 创建新数据库,但 EF 设计器还可用于 数据库 First 工作流,以映射到现有数据库。

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

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

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

观看视频

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

作者:朱莉娅·科尔尼奇

视频WMV | MP4 | WMV (ZIP)

先决条件

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

设置项目

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

使用 EF 设计器创建新模型

  1. 在解决方案资源管理器中右键单击项目名称,指向“添加”,然后单击“新建项
  2. 从左侧菜单中选择“数据”,然后在“模板”窗格中选择 ADO.NET 实体数据模型
  3. 输入 UniversityModel.edmx 以获取文件名,然后单击“ 添加”
  4. 在“实体数据模型向导”页上,在“选择模型内容”对话框中选择 “空模型
  5. 单击“完成”

将显示 Entity Designer,它提供用于编辑模型的设计图面。

向导执行以下操作:

  • 生成 EnumTestModel.edmx 文件,该文件定义概念模型、存储模型及其之间的映射。 将 .edmx 文件的元数据项目处理属性设置为“嵌入输出程序集”,以便生成的元数据文件嵌入到程序集中。
  • 添加对以下程序集的引用:EntityFramework、System.ComponentModel.DataAnnotations 和 System.Data.Entity。
  • 创建 UniversityModel.tt 和 UniversityModel.Context.tt 文件,并将其添加到 .edmx 文件下。 这些 T4 模板文件生成代码,该代码用于定义 DbContext 派生类型和 POCO 类型,这些类型映射到 .edmx 模型中的实体。

添加新实体类型

  1. 右键单击设计图面的空白区域,选择“ 添加 -> 实体”,此时会显示“新建实体”对话框
  2. 指定 University 作为类型名称,并为键属性名称指定 UniversityID ,将类型保留为 Int32
  3. 单击 “确定”
  4. 右键单击实体并选择“添加新 -> 标量属性
  5. 将新属性重命名为 Name
  6. 添加另一个标量属性并将其重命名为 “位置 打开属性”窗口,并将新属性的类型更改为 Geography
  7. 保存模型并生成项目

    注释

    生成时,有关未映射实体和关联的警告可能会显示在错误列表中。 可以忽略这些警告,因为在我们选择从模型生成数据库后,错误将消失。

从模型生成数据库

现在,我们可以生成基于模型的数据库。

  1. 右键单击实体设计器图面上的空白区域,然后选择 “从模型生成数据库”
  2. 显示生成数据库向导的“选择数据连接”对话框。单击新建连接按钮,为服务器名称指定(localdb)\mssqllocaldb,为数据库指定University,然后单击确定
  3. 询问是否要创建新数据库的对话框将弹出,单击“ ”。
  4. 单击“ 下一步 ”,“创建数据库向导”会生成用于创建数据库的数据定义语言(DDL)。生成的 DDL 显示在“摘要和设置”对话框中注意,DDL 不包含映射到枚举类型的表的定义
  5. 单击完成按钮并不会执行 DDL 脚本。
  6. 创建数据库向导执行以下操作:在 T-SQL 编辑器中打开 UniversityModel.edmx.sql 生成 EDMX 文件的存储架构和映射部分,将连接字符串信息添加到 App.config 文件中
  7. 在 T-SQL 编辑器中单击鼠标右键,然后选择“ 执行 连接到服务器”对话框,输入步骤 2 中的连接信息,然后单击“ 连接”
  8. 若要查看生成的架构,请在 SQL Server 对象资源管理器中右键单击数据库名称,然后选择“ 刷新”

持久保存和检索数据

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

该代码将两个新的 University 对象添加到上下文中。 空间属性是使用 DbGeography.FromText 方法初始化的。 表示为 WellKnownText 的地理点将传递给该方法。 然后,代码保存数据。 然后,构造并执行一个 LINQ 查询,该查询返回位置与指定位置最近的 University 对象。

using (var context = new UniversityModelContainer())
{
    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.

若要查看数据库中的数据,请在 SQL Server 对象资源管理器中右键单击数据库名称,然后选择“ 刷新”。 然后,单击表上的鼠标右键,然后选择“ 查看数据”。

总结

在本演练中,我们介绍了如何使用 Entity Framework Designer 映射空间类型,以及如何在代码中使用空间类型。