如何在.NET 6 EF Core项目中实现SQL Server数据库备份与恢复?
.NET 6 EF Core 数据库备份与恢复实现方案
旧版EF的备份代码无法直接在EF Core中运行,因为EF Core没有提供专属的备份/恢复API,需要结合数据库原生命令实现。以下是针对SQL Server的完整适配方案(其他数据库可替换对应命令):
一、数据库备份实现
通过EF Core上下文获取连接字符串,执行SQL Server原生备份命令:
using Microsoft.EntityFrameworkCore; using System.Data.SqlClient; public static class DbBackupHelper { // 异步备份数据库 public static async Task BackupDatabaseAsync<TContext>(TContext context, string backupFilePath) where TContext : DbContext { var connectionString = context.Database.GetConnectionString(); using var connection = new SqlConnection(connectionString); var databaseName = connection.Database; // SQL Server全量备份命令 var backupCommand = $"BACKUP DATABASE [{databaseName}] TO DISK = N'{backupFilePath}' WITH NOFORMAT, NOINIT, NAME = N'{databaseName}-Full Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10"; using var cmd = new SqlCommand(backupCommand, connection); await connection.OpenAsync(); await cmd.ExecuteNonQueryAsync(); } }
使用说明
- 调用时传入你的DbContext实例和备份文件路径(示例:
@"D:\Backups\MyAppDb.bak") - 运行程序的账户需拥有数据库备份权限,备份目录需配置写入权限
二、数据库恢复实现
恢复前需强制断开数据库所有活跃连接,避免占用冲突:
// 异步恢复数据库 public static async Task RestoreDatabaseAsync<TContext>(TContext context, string backupFilePath) where TContext : DbContext { var connectionString = context.Database.GetConnectionString(); using var connection = new SqlConnection(connectionString); var databaseName = connection.Database; // 强制断开所有连接,切换为单用户模式 var killConnectionsCmd = $"ALTER DATABASE [{databaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"; using var killCmd = new SqlCommand(killConnectionsCmd, connection); // 执行恢复命令(覆盖现有数据库) var restoreCommand = $"RESTORE DATABASE [{databaseName}] FROM DISK = N'{backupFilePath}' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10"; using var restoreCmd = new SqlCommand(restoreCommand, connection); await connection.OpenAsync(); await killCmd.ExecuteNonQueryAsync(); await restoreCmd.ExecuteNonQueryAsync(); // 恢复多用户模式 var multiUserCmd = $"ALTER DATABASE [{databaseName}] SET MULTI_USER"; using var multiUserCmdObj = new SqlCommand(multiUserCmd, connection); await multiUserCmdObj.ExecuteNonQueryAsync(); }
注意事项
- 恢复操作会覆盖现有数据库,务必提前确认数据安全性
- 生产环境恢复前需暂停相关业务服务,避免数据冲突
- 运行账户需拥有数据库恢复权限
三、其他数据库适配
如果使用MySQL、PostgreSQL等数据库,替换为对应原生命令即可,示例:
- MySQL:通过
Process执行mysqldump -u [用户名] -p[密码] [数据库名] > [备份路径]命令 - PostgreSQL:通过
Process执行pg_dump -U [用户名] [数据库名] > [备份路径]命令
内容的提问来源于stack exchange,提问作者Ihsan Sadat
相关产品推荐
相关产品推荐

