项目引用概述

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

使用 SQL 数据库项目中的项目引用,可以在 SQL 项目和其他项目之间创建依赖项。 项目引用有两种主要类型:

  • 数据库引用 - SQL 项目之间的依赖关系或对 .dacpac 提供数据库对象定义的文件和 NuGet 包的引用。
  • .NET 项目引用 - 从 .NET 项目到 SQL 项目的引用,适用于集成测试、部署自动化和代码生成等方案。

了解何时以及如何使用每种类型的引用时,可以有效地构建数据库开发工作流。

数据库引用

数据库引用允许 SQL 项目合并来自另一个 SQL 项目、 .dacpac 文件或已发布的 NuGet 包的对象。 当数据库对象依赖于在其他位置定义的对象(例如共享架构或系统数据库对象中的表)时,将使用这些引用。

对同一解决方案中另一个 SQL 项目的基本数据库引用如下所示:

<ItemGroup>
  <ProjectReference Include="..\Database1\Database1.sqlproj" />
</ItemGroup>

数据库引用支持三种关系类型:

  • 同一数据库 - 引用项目中的对象将成为同一数据库模型的一部分。
  • 不同的数据库,同一服务器 - 使用包含数据库名称的 SQLCMD 变量,以三部分命名法引用对象。
  • 不同的数据库、不同的服务器 - 使用 SQLCMD 变量,通过四部分命名法引用服务器和数据库名称的对象。

有关配置数据库引用的详细信息,包括每种关系类型的示例以及有关使用引用生成和发布项目的指南,请参阅 数据库引用概述

.NET 项目引用

.NET 项目可以引用 SQL 项目以将数据库开发与应用程序代码集成。 当 .NET 应用程序需要访问 SQL 项目的生成输出( .dacpac 文件)以进行测试、部署或代码生成目的时,此引用类型非常有用。

用例

从 .NET 项目引用 SQL 项目的常见方案包括:

  • 集成测试 - 在运行测试之前,测试将数据库架构部署到测试容器或本地实例的项目。
  • 部署自动化 - 以编程方式将控制台应用程序或工具部署到 .dacpac 目标环境。
  • 模型代码生成 - 基于 SQL 项目中定义的数据库架构生成代码的应用程序。

配置项目引用

将 .NET 项目中的项目引用添加到 SQL 项目时,必须包含该 ReferenceOutputAssembly="false" 属性。 此属性告知 .NET 生成进程将 SQL 项目视为生成依赖项,而不尝试将其引用为 .NET 程序集。

<ItemGroup>
  <ProjectReference Include="..\Database1\Database1.sqlproj" ReferenceOutputAssembly="false" />
</ItemGroup>

此设置 ReferenceOutputAssembly="false" 是必需的,因为 SQL 项目生成 .dacpac 文件作为其主输出,而不是 .NET 程序集。 如果没有此属性,.NET 生成进程将尝试加载 .dacpac 为程序集,失败并出现类似于以下错误:

error CS0009: Metadata file 'Database1.dacpac' could not be opened -- Unknown file format.

访问 .NET 项目中的 DACPAC

配置项目引用后,SQL 项目在 .NET 项目之前生成。 该文件 .dacpac 在 SQL 项目的输出目录中可用(通常 bin/Debugbin/Release)。

若要以编程方式在 .NET 代码中访问 .dacpac ,请引用相对于项目结构的文件路径。 例如,在使用 Testcontainers 创建 SQL Server 实例的集成测试中:

// Path to the dacpac file built by the referenced SQL project
var dacpacPath = Path.Combine(
    Directory.GetCurrentDirectory(),
    "..", "..", "..", "..",
    "Database1", "bin", "Debug",
    "Database1.dacpac");

// Use DacFx to deploy the dacpac to your test database
var dacServices = new DacServices(connectionString);
using var dacpac = DacPackage.Load(dacpacPath);
dacServices.Deploy(dacpac, "TestDatabase");

将 dacpac 复制到输出目录

为了更轻松地访问 .dacpac 该文件,请将 .NET 项目配置为在生成过程中将其复制到输出目录。 将以下配置密钥添加到 .csproj 文件。

<ItemGroup>
  <None Include="..\Database1\bin\$(Configuration)\Database1.dacpac"
        CopyToOutputDirectory="PreserveNewest"
        Link="Database1.dacpac" />
</ItemGroup>

此配置将 .dacpac 文件复制到 .NET 项目的输出目录,以便可以使用更简单的路径引用该文件:

var dacpacPath = Path.Combine(
    AppContext.BaseDirectory,
    "Database1.dacpac");