适用于:SQL Server
Azure 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/Debug 或 bin/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");