演练:根据 EDMX 架构文件生成 F# 类型 (F#)
F# 的 3.0 演练显示如何创建由实体数据模型 (EDM) 表示的数据的类型,在 .edmx 文件中指定的架构。 此演练也显示如何使用 EdmxFile 类型提供程序。 在开始之前,请考虑 SqlEntityConnection 类型提供程序是否是一个更合适的类型提供程序选项。 SqlEntityConnection 类型提供程序在项目的开发阶段中,都可以选择实时数据库可以连接到的方案的情况,这样,在编译时您就不介意指定连接字符串。 但是,此类型提供程序还会受到限制,因为它不作为众多数据库功能公开,就像 EdmxFile 类型提供程序一样。 此外,如果没有使用实体数据模型的数据库项目的实时数据库连接,则可以使用 .edmx 文件针对数据库进行编码。 在您使用 EdmxFile 类型提供程序时,F# 编译器运行 EdmGen.exe 以生成其提供的类型。
本演练演示以下任务,您必须按该演练的顺序执行才能成功:
Creating an EDMX file
Creating the project
Finding or creating the entity data model connection string
Configuring the type provider
Querying the data
Calling a stored procedure
创建 EDMX 文件
如果已具有 EDMX 文件,则可以跳过此步骤。
创建 EDMX 文件
- 如果没有 EDMX 文件,可以按照 ADO.NET 实体框架快速入门 的指令创建数据库的实体数据模型和 EDMX 文件。 或者,可以参阅在该步骤 To configure the Entity Data Model 的此演练结尾处的命令。
创建项目
在此步骤中,创建项目并添加适当的引用可以使用 EDMX 类型提供程序。
创建 F# 项目
关闭前一个项目,创建一个名为 SchoolEDM 的项目。
在**“解决方案资源管理器”中,打开“引用”的快捷菜单,然后选择“添加引用”**。
在**“程序集”区域中,选择“框架”**节点。
在可用的程序集列表中,选择 System.Data.Entity 和 System.Data.Linq 程序集,然后选择**“添加”**按钮可以添加这些程序集的引用到您的项目。
在**“程序集”区域中,选择“扩展”**节点。
在可用的扩展列表中,将引用添加到FSharp.Data.TypeProviders 程序集。
添加以下代码以打开相应的命名空间。
open System.Data.Linq open System.Data.Entity open Microsoft.FSharp.Data.TypeProviders
查找或创建实体数据模型的连接字符串
实体数据模型(EDMX 连接字符串)连接字符串是不仅包括数据库提供程序连接字符串,还包括附加信息的特定连接字符串。 例如,简单的 SQL Server 数据库 EDMX 连接字符串类似于以下代码。
let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"
有关 EDMX 连接字符串的更多信息,请参见 Connection Strings。
查找或创建实体数据模型的连接字符串
EDMX 连接字符串难以手动生成,因此,您可以通过通过编程产生它节省时间。 如果了解 EDMX 连接字符串,则可以跳过此步骤,只在下一步中使用该字符串。 如果不行,请使用以下代码从您提供的数据库连接字符串生成 EDMX 连接字符串。
open System open System.Data open System.Data.SqlClient open System.Data.EntityClient open System.Data.Metadata.Edm let getEDMConnectionString(dbConnectionString) = let dbConnection = new SqlConnection(connectionString) let resourceArray = [| "res://*/" |] let assemblyList = [| System.Reflection.Assembly.GetCallingAssembly() |] let metaData = MetadataWorkspace(resourceArray, assemblyList) new EntityConnection(metaData, dbConnection)
配置类型提供程序
在此步骤中,您创建和配置类型提供程序以 EDMX 连接字符串,因此,您会在 .edmx 文件中定义生成架构的类型。
配置类型提供程序和生成类型
将在本演练的第一步中生成的 .edmx 文件复制到项目文件夹。
打开您的 F# 项目中的项目节点的快捷菜单,选择**“添加现有项”**,然后选择 .edmx 文件以将其添加到项目中。
输入以下代码来激活 .edmx 文件的类型提供程序。 使用运行 SQL Server 的服务器的名称和您实例的名称替换服务器\实例,并使用本演练中来自第一步的 .edmx 文件的名称。
type edmx = EdmxFile<"Model1.edmx", ResolutionFolder = @"<folder that contains your .edmx file>> let edmConnectionString = getEDMConnectionString("Data Source=SERVER\instance;Initial Catalog=School;Integrated Security=true;") let context = new edmx.SchoolModel.SchoolEntities(edmConnectionString)
查询数据
在本步骤中,您使用 F# 查询表达式可以查询数据库。
查询数据。
输入以下代码以查询实体数据模型中的数据。
query { for course in context.Courses do select course } |> Seq.iter (fun course -> printfn "%s" course.Title) query { for person in context.Person do select person } |> Seq.iter (fun person -> printfn "%s %s" person.FirstName person.LastName) // Add a where clause to filter results query { for course in context.Courses do where (course.DepartmentID = 1) select course) |> Seq.iter (fun course -> printfn "%s" course.Title) // Join two tables query { for course in context.Courses do join (for dept in context.Departments -> course.DepartmentID = dept.DepartmentID) select (course, dept.Name) } |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
调用存储过程
通过使用 EDMX 类型提供程序您可以调用存储过程。 在下一步中,School 数据库包含一个存储过程,UpdatePerson,更新记录给定列的新值。 您可以使用此存储过程,因为该过程作为 DataContext 类型上的方法公开。
调用存储过程
添加以下代码以更新记录。
// Call a stored procedure. let nullable value = new System.Nullable<_>(value) // Assume now that you must correct someone's hire date. // Throw an exception if more than one matching person is found. let changeHireDate(lastName, firstName, hireDate) = query { for person in context.People do where (person.LastName = lastName && person.FirstName = firstName) exactlyOne } |> (fun person -> context.UpdatePerson(nullable person.PersonID, person.LastName, person.FirstName, nullable hireDate, person.EnrollmentDate)) changeHireDate("Abercrombie", "Kim", DateTime.Parse("1/12/1998")) |> printfn "Result: %d"
如果成功,则结果为 1。 请注意 exactlyOne 用于查询表达式,以保证只有一个结果返回;否则,将引发异常。 此外,要更轻松地使用可以为 null 的值,可以使用此代码中定义的简单 nullable 函数,以创建一般值外的可以为 null 的值。
配置实体数据模型
仅当要了解从数据库生成完整实体数据模型且不含要测试的数据库时,才应完成这一步。
配置实体数据模型
在菜单栏上,依次选择**“SQL”、单击“Transact-SQL 编辑器”、“新建查询”**以创建数据库。 如果已提示,请指定您的数据库服务器和实例。
如 Creating the School Sample Database 所述,复制并粘贴创建 Student 数据库的数据库脚本的内容。
在本演练中的下一步骤是根据 ADO.NET Entity Data Model Quickstart。
通过用三角形符号来选择任务栏按钮或选择 Ctrl+Q 键来运行 SQL 脚本。
在**“服务器资源管理器”中,打开“数据连接”的快捷菜单,选择“添加连接”**,然后输入数据库服务器的名称、实例名的名称和 School 数据库。
创建 C# 或 Visual Basic 控制台应用程序项目,打开其快捷菜单上,选择**“添加新项目”,然后选择“ADO.NET 实体数据模型”**。
“实体数据模型向导”将打开。 通过使用此向导,您可以选择如何创建想要的实体数据模型。
在**“选择模型内容”下,选择“从数据库生成”**复选框。
在下一页,选择新创建的 School 数据库作为数据连接。
此连接应与 <servername>.<instancename>.School.dbo 类似。
您的实体连接字符串随后可能很重要,因此将其复制到剪贴板。
确保选中复选框保存实体连接字符串转换为 App.Config 选定某个文件并记下在文本框中的字符串值,如果需要应帮助您以后查找连接字符串。
在下一页上,选择**“表”和“存储过程和函数”**。
通过选择这些顶级节点,选择所有表、存储的过程和函数。 如果想要还可以单独选择这些。
请确保这些设置的复选框为选中状态。
第一个**“确定所生成对象名称的单复数形式”复选框,引用是否将单数形式更改为复数,反之亦然到表示数据库表的命名对象匹配约定。 选项卡,“包括外键列在模型中”**复选框,确定是否包含该目的是联接到对象类型的其他字段为数据库架构生成的字段。 第三个复选框指示在模型中是否包括存储过程和函数。
选择**“完成”**按钮以生成包含基于 School 数据库的实体数据模型的 .edmx 文件。
文件 Model1.edmx 添加到您的项目,并且显示数据库关系图。
在菜单栏上,选择**“视图”菜单中选择“其他窗口”、“实体数据模型浏览器”来查看所有模型的详细信息,或选择“实体数据模型映射详细信息”**来打开窗口,该窗口显示生成的对象模型如何映射在数据库表和列上。
后续步骤
通过查看 查询表达式 (F#) 中列出的可用查询运算符浏览其他查询。