You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:50:33