空间 - 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
先决条件
需要安装 Visual Studio 2012、Ultimate、Premium、Professional 或 Web Express Edition 才能完成本演练。
设置项目
- 打开 Visual Studio 2012
- 在“文件”菜单上指向“新建”,然后单击“项目”
- 在左侧窗格中,单击“Visual C#”,然后选择“控制台”模板
- 输入“SpatialEFDesigner”作为项目名称,然后单击“确定”
使用 EF 设计器创建新模型
- 在“解决方案资源管理器”中右键单击该项目名称,指向“添加”,然后单击“新建项”
- 从左侧菜单中选择“数据”,然后在“模板”窗格中选择“ADO.NET 实体数据模型”
- 输入“UniversityModel.edmx”作为文件名,然后单击“添加”
- 在“实体数据模型向导”页面的“选择模型内容”对话框中,选择“空模型”
- 单击“完成”
将显示 Entity Designer,它提供用于编辑模型的设计图面。
该向导执行下列操作:
- 生成 EnumTestModel.edmx 文件,该文件定义概念模型、存储模型以及这两种模型之间的映射。 将 .edmx 文件的元数据项目处理属性设置为嵌入输出程序集中,以便将生成的元数据文件嵌入到程序集中。
- 添加对以下程序集的引用:EntityFramework、System.ComponentModel.DataAnnotations 和 System.Data.Entity。
- 创建 UniversityModel.tt 和 UniversityModel.Context.tt 文件并将其添加到 .edmx 文件中。 这些 T4 模板文件会生成用于定义映射到 .edmx 模型中实体的 DbContext 派生类型和 POCO 类型的代码
添加新的实体类型
- 右键单击设计图面的空白区域,选择“添加”->“实体”,将出现“新建实体”对话框
- 指定“University”作为类型名称并指定“UniversityID”作为键属性名称,将类型保留为“Int32”
- 单击 “确定”
- 右键单击实体并选择“添加新实体”->“标量属性”
- 将新属性重命名为“Name”
- 添加另一个标量属性并将其重命名为“Location” 打开“属性”窗口并将新属性的类型更改为“Geography”
- 保存模型并生成项目
注意
生成模型时,错误列表中可能会出现有关未映射实体和相关实体的警告。 可以忽略这些警告,因为选择从模型生成数据库后,错误就会消失。
从模型生成数据库
现在,可以根据模型生成数据库。
- 右键单击 Entity Designer 图面上的空白区域,然后选择“从模型生成数据库”
- 将显示“生成数据库”向导的“选择数据连接”对话框 单击“新建连接”按钮指定“(localdb)\mssqllocaldb”作为服务器名称,并指定“University”作为数据库,然后单击“确定”
- 将弹出一个对话框,询问是否要创建新数据库,请单击“是”。
- 单击“下一步”,“创建数据库”向导将生成用于创建数据库的数据定义语言 (DDL)生成的 DDL 显示在“摘要和设置”对话框中 请注意,DDL 不包含映射到枚举类型的表的定义
- 单击“完成”单击“完成”并不会执行 DDL 脚本。
- “创建数据库”向导执行以下操作: 在 T-SQL 编辑器中打开 UniversityModel.edmx.sql生成 EDMX 文件的存储架构和映射部分 将连接字符串信息添加到 App.config 文件中
- 在 T-SQL 编辑器中单击鼠标右键并选择“执行”将出现“连接到服务器”对话框,输入步骤 2 中的连接信息,然后单击“连接”
- 若要查看生成的架构,请在 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 映射空间类型以及如何在代码中使用空间类型。