空间 - EF Designer

注意

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

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

本演练将使用 Model First 来创建新的数据库,但也可将 EF 设计器与 Database First 工作流结合使用以映射到现有数据库。

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

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

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

观看视频

该视频展示了如何使用 Entity Framework Designer 映射空间类型。 它还演示如何使用 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. 输入“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 模板文件会生成用于定义映射到 .edmx 模型中实体的 DbContext 派生类型和 POCO 类型的代码

添加新的实体类型

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

    注意

    生成模型时,错误列表中可能会出现有关未映射实体和相关实体的警告。 可以忽略这些警告,因为选择从模型生成数据库后,错误就会消失。

从模型生成数据库

现在,可以根据模型生成数据库。

  1. 右键单击 Entity Designer 图面上的空白区域,然后选择“从模型生成数据库”
  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 对象资源管理器中右键单击数据库名称,然后选择“刷新”

保留和检索数据

打开 Program.cs 文件,其中定义了 Main 方法。 将以下代码添加到 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 映射空间类型以及如何在代码中使用空间类型。