通过


空间 - EF Designer

注释

仅限 EF5 - 本页中讨论的功能、API 等是在实体框架 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. 单击“完成”

将显示实体设计器,该设计器提供用于编辑模型的设计图面。

向导执行以下操作:

  • 生成 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 查询,以返回其位置最接近指定位置的大学对象。

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 映射空间类型,以及如何在代码中使用空间类型。