演练:根据 DBML 文件生成 F# 类型 (F#)

当您排列架构信息中输入在 .dbml 文件时,F# 的 3.0 演练介绍如何从数据库中创建数据的类型。 LINQ 到 SQL 使用此文件格式表示数据库架构。 可以使用对象关系设计器 (O/R) 设计器在 Visual Studio 中生成 LINQ to SQL 架构文件。 有关更多信息,请参见O/R Designer OverviewCode Generation in LINQ to SQL

数据库标记语言 (DBML) 类型提供程序可让您使用基于数据库架构的类型来编写代码,无需在编写时指定静态连接字符串。 如果需要允许这一可能性:比起开发应用程序时所使用的,最终应用程序将使用不同的数据库、不同的凭据或不同的连接字符串,则这将非常有用。 如果具有可在编译时使用的直接数据库连接并且该连接是您在生成应用程序中最终将使用的同一数据库和凭证,则您也可以使用 SQLDataConnection 类型提供程序。 有关更多信息,请参见演练:使用类型提供程序访问 SQL 数据库 (F#)

本演练阐释了以下任务。 应该完成演示中的顺序至成功:

  • Creating a .dbml file

  • Creating and setting up an F# project

  • Configuring the type provider and generating the types

  • Querying the database

创建 .dbml 文件

如果没有要测试的数据库,请按照 演练:使用类型提供程序访问 SQL 数据库 (F#) 底部的命令创建一个。 如果您遵循这些说明,您将在 SQL 服务器上创建一个名为 MyDatabase 包含几个简单的表和存储过程的数据库。

如果已具有 .dbml 文件,则可以跳到该部分,Create and Set Up an F# Project。 否则,您可以创建 .dbml 文件给定现有 SQL 数据库和使用命令行工具 SqlMetal.exe。

使用 SqlMetal.exe,创建 .dbml 文件

  1. 打开**“开发人员命令提示”**。

  2. 通过在命令提示处输入 SqlMetal.exe /? 确保您有权访问 SqlMetal.exe。 SqlMetal.exe 通常安装在**“程序文件”程序文件 (x86)** 中的Microsoft SDKs 文件夹下。

  3. 使用如下命令行选项运行 SqlMetal.exe。 用相应路径替换 c:\destpath 来创建 .dbml 文件,并为数据库服务器、实例名称和数据库名称插入相应值。

    SqlMetal.exe /sprocs /dbml:C:\destpath\MyDatabase.dbml /server:SERVER\INSTANCE /database:MyDatabase
    

    备注

    如果 SqlMetal.exe 由于权限问题而导致创建文件时出问题,则请将当前目录更改为您对其具有写访问权限的文件夹。

  4. 还可以查看其他可用的命令行选项。 例如,如果需要将视图和 SQL 功能包括在生成的类型中,这儿有你可以选择的内容。 有关更多信息,请参见SqlMetal.exe(代码生成工具)

创建和设置 F# 项目

在此步骤中,创建项目并添加适当的引用可以使用 DBML 类型提供程序。

创建 F# 项目

  1. 向解决方案添加 F# 控制台应用程序项目。

  2. 在**“解决方案资源管理器”中,打开“引用”的快捷菜单,然后选择“添加引用”**。

  3. 在**“程序集”区域中,选择“框架”**节点,然后在可用的程序集列表中选择 System.DataSystem.Data.Linq程序集。

  4. 在**“程序集”区域中,选择“扩展”**,并在可用的程序集列表中选择 FSharp.Data.TypeProviders

  5. 选择**“确定”**按钮将对下列程序集的引用添加到项目。

  6. (可选)。 将复制您在上一步中创建的 .dbml 文件,并将文件粘贴到项目的主文件夹中。 此文件夹包含项目文件 (.fsproj) 和代码文件。 在菜单栏上,选择**“项目”“添加现有项目”**并指定 .dbml 文件以将其添加到项目中。 如果完成这些步骤,则在下一步中可以忽略 ResolutionFolder 静态参数。

配置类型提供程序

在本节中,从描述在 .dbml 文件中的架构中创建一个类型提供程序和生成类型。

配置类型提供程序和生成类型

  • 添加代码以打开 TypeProviders 命名空间和实例化您要使用的.dbml 文件的类型提供程序。 如果您向项目添加了 .dbml 文件,则可以忽略 ResolutionFolder 静态参数。

    open Microsoft.FSharp.Data.TypeProviders
    
    
    type dbml = DbmlFile<"MyDatabase.dbml", ResolutionFolder = @"<path to folder that contains .dbml file>>
    
    // This connection string can be specified at run time.
    let connectionString = "Data Source=MYSERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;"
    let dataContext = new dbml.Mydatabase(connectionString)
    

    DataContext 类型是提供对所有生成类型并继承自 DataContext。 DbmlFile 类型提供程序可供您设置各种静态参数。 例如,通过指定 DataContext=MyDataContext,您可以使用 DataContext 类型的不同名称。 在这样的情况下,您的代码将类似于以下示例:

    open Microsoft.FSharp.Data.TypeProviders
    
    
    
    type dbml = DbmlFile<"MyDatabase.dbml",
                         ContextTypeName = "MyDataContext">
    
    // This connection string can be specified at run time.
    let connectionString = "Data Source=MYSERVER\INSTANCE;Initial Catalog=MyDatabase;Integrated Security=SSPI;"
    let db = new dbml.MyDataContext(connectionString)
    

查询数据库

在本节中,您使用 F# 查询表达式可以查询数据库。

查询数据。

  • 添加代码以查询数据库。

    query {
            for row in db.Table1 do
            where (row.TestData1 > 2)
            select row
    }
    |> Seq.iter (fun row -> printfn "%d %s" row.TestData1 row.Name)
    

后续步骤

您可以继续使用其他查询表达式或从数据上下文中获取数据库连接和执行常规 ADO.NET 数据操作。 有关其他步骤,请参见 演练:使用类型提供程序访问 SQL 数据库 (F#) 中“查询数据”之后的部分。

请参见

任务

演练:使用类型提供程序访问 SQL 数据库 (F#)

参考

DbmlFile 类型提供程序 (F#)

SqlMetal.exe(代码生成工具)

查询表达式 (F#)

其他资源

类型提供程序