如何在.NET Core 2.0应用中使用.dacpac文件部署数据库?
在.NET Core 2.0中部署.dacpac文件的解决方案
我之前把.NET Framework项目迁移到.NET Core时也踩过这个坑,原来的Microsoft.SqlServer.Dac包确实只支持.NET Framework,不过针对.NET Core 2.0部署.dacpac,有几个靠谱的方案可以选:
方案一:使用.NET Core兼容的DacFx NuGet包
微软提供了支持.NET Core的DacFx版本,你可以替换原来的包为Microsoft.SqlServer.DacFx.x64(或对应x86版本),注意要选择支持netcoreapp2.0的版本(比如150.4769.1这类较早的版本,新版本可能不再兼容.NET Core 2.0)。
安装后,你可以沿用大部分原来的代码逻辑,API和之前的DacServices基本一致,示例代码如下:
using Microsoft.SqlServer.Dac; var connectionString = "Server=your-server;Database=your-db;User Id=xxx;Password=xxx;"; var dacpacPath = @"path/to/your/database.dacpac"; // 加载dacpac文件 var dacPackage = DacPackage.Load(dacpacPath); // 初始化DacServices实例 var dacServices = new DacServices(connectionString); // 执行数据库部署 dacServices.Deploy( dacPackage, "your-database-name", upgradeExisting: true, options: new DacDeployOptions() { // 按需配置部署选项,比如忽略权限差异 IgnorePermissions = true });
方案二:调用SqlPackage.exe命令行工具
如果NuGet包的兼容版本不好找,或者你需要更灵活的部署控制,可以使用跨平台的SqlPackage.exe工具(现在也有.NET Core版本的SqlPackage)。你可以在应用中通过进程调用的方式执行部署命令:
首先确保SqlPackage已安装(可以通过NuGet包Microsoft.SqlServer.SqlPackage获取,或者直接下载独立工具),然后在代码中调用:
using System.Diagnostics; var sqlPackagePath = @"path/to/SqlPackage.exe"; var dacpacPath = @"path/to/your/database.dacpac"; var connectionString = "Server=your-server;Database=your-db;Integrated Security=True;"; var processStartInfo = new ProcessStartInfo { FileName = sqlPackagePath, Arguments = $"/Action:Publish /SourceFile:\"{dacpacPath}\" /TargetConnectionString:\"{connectionString}\"", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true }; using var process = Process.Start(processStartInfo); process.WaitForExit(); // 读取执行日志 var output = process.StandardOutput.ReadToEnd(); var error = process.StandardError.ReadToEnd(); if (process.ExitCode != 0) { throw new Exception($"部署失败:{error}"); }
方案三:改用Entity Framework Core迁移(可选)
如果你的项目可以重构数据库部署逻辑,EF Core的迁移功能也是一个不错的选择,它可以通过代码管理数据库版本迭代。不过这个方案需要你把原有的.dacpac逻辑转换为EF Core的迁移脚本,更适合长期维护的新项目。
内容的提问来源于stack exchange,提问作者Oleg Bezhan
相关产品推荐
相关产品推荐

