安装EF实体模型框架
Data Access and Storage > 学习 > Entity Framework > 开始操作 > 空间 - EF 设计器
本视频和分步演练介绍如何使用实体框架设计器来映射空间类型。另外,还演示了如何使用 LINQ 查询来查找两个位置之间的距离。
本演练将使用 Model First 来创建一个新数据库,但也可以将 EF 设计器与 Database First 工作流结合使用来映射到现有数据库。
空间类型支持在实体框架 5 中引入。注意:要使用空间类型、枚举和表值函数等新特性,开发时必须面向 .NET Framework 4.5。Visual Studio 2012 默认面向 .NET 4.5。
要使用空间数据类型,您还必须使用提供空间支持的实体框架提供程序。有关更多信息,请参见 空间类型的提供程序支持。
存在两种主要的空间数据类型:地理和几何。地理数据类型用于存储椭球数据(例如,GPS 纬度和经度坐标)。几何数据类型则用于表示欧几里德(扁平)坐标系统。
必备条件
为完成本演练,需要安装 Visual Studio 2012 的旗舰版、高级版、专业版或 Web Express 版本。
设置项目
- 打开 Visual Studio 2012
- 在“文件”菜单上指向“新建”,再单击“项目”
- 在左窗格中单击“Visual C#”,然后选择“控制台”模板
- 输入 SpatialEFDesigner 作为项目名称,然后单击“确定”
使用 EF 设计器创建新模型
- 在解决方案资源管理器中右键单击项目名称,指向“添加”,然后单击“新建项”
- 从左侧菜单中选择“数据”,然后在“模板”窗格中选择“ADO.NET 实体数据模型”
- 输入 UniversityModel.edmx 作为文件名,然后单击“添加”
- 在“实体数据模型向导”页上的“选择模型内容”对话框中选择“空模型”
- 单击“完成”
显示实体设计器,为模型编辑提供设计图面。
该向导执行下列操作:
- 生成定义概念模型、存储模型以及二者之间的映射的 EnumTestModel.edmx 文件。将 .edmx 文件的“元数据项目处理”属性设置为“嵌入输出程序集中”,以便生成的元数据文件嵌入到程序集中。
- 添加对以下程序集的引用:EntityFramework、System.ComponentModel.DataAnnotations 和 System.Data.Entity。
- 创建 UniversityModel.tt 和 UniversityModel.Context.tt 文件,将它们添加到 .edmx 文件下面。这些 T4 模板文件生成的代码用于定义 DbContext 派生类型和映射到 .edmx 模型中的实体的 POCO 类型
新增实体类型
- 右键单击设计图面上的空区域,选择“添加” ->“实体”,随即出现“新建实体”对话框
- 指定 University 作为类型名称,指定 UniversityID 作为键属性名称,将类型保留为 Int32
- 单击“确定”
- 右键单击该实体,然后选择“新增”->“标量属性”
- 将新属性重命名为 Name
- 添加其他标量属性,将其命名为 Location 打开“属性”窗口,将新属性的类型更改为 Geography
- 保存模型并生成项目 注意:生成时,“错误列表”中可能会出现有关未映射的实体和关联的警告。可以忽略这些警告,因为在我们选择从模型生成数据库之后,这些错误就会消失。
根据模型生成数据库
现在,可生成一个基于模型的数据库。
- 在设计图面上的空白处右键单击,然后选择“根据模型生成数据库”
- 将显示“生成数据库向导”的“选择您的数据连接”对话框 单击“新建连接”按钮 指定 (localdb)\v11.0 作为服务器名称,University 作为数据库,然后单击“确定”
- 将弹出一个询问是否需要创建新数据库的对话框,请单击“是”。
- 单击“下一步”,“创建数据库向导”生成用于创建数据库的数据定义语言 (DDL) 生成的 DDL 显示在“摘要和设置”对话框中 请注意,DDL 不包含映射到枚举类型的表的定义
- 单击“完成” 单击“完成”不会执行 DDL 脚本。
- “创建数据库向导”执行以下操作: 在 T-SQL 编辑器中打开 UniversityModel.edmx.sql 生成 EDMX 文件的存储架构和映射部分 向 App.config 文件添加连接字符串信息
- 在 T-SQL 编辑器中右键单击,然后选择“执行” 出现“连接到服务器”对话框,输入步骤 2 中的连接信息,然后单击“连接”
- 若要查看生成的架构,请在 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 对象资源管理器中右键单击数据库名称,然后选择“刷新”。然后,右键单击表,然后选择“查看数据”。
摘要
本演练介绍了如何使用实体框架设计器来映射空间类型以及如何在代码中使用空间类型。