备份数据库mdf&;实体框架

本文关键字:实体 框架 amp 数据库 mdf 备份 | 更新日期: 2023-09-27 18:22:51

我有一个数据库(mdf文件),我正在使用实体框架处理它。是否可以备份MDF文件。我已经尝试过了,但SMO,但问题是因为我使用的是mdf文件,数据库名称为空。我读到它是自动生成的。

我的备份代码:

        String destinationPath = "C:''";
        Backup sqlBackup = new Backup();
        sqlBackup.Action = BackupActionType.Database;
        sqlBackup.BackupSetDescription = "ArchiveDataBase:" + DateTime.Now.ToShortDateString();
        sqlBackup.BackupSetName = "Archive";
        
        BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath, DeviceType.File);
        ServerConnection connection = new ServerConnection(".''SQLEXPRESS");
        Server sqlServer = new Server(connection);
        StringCollection sc = new StringCollection();
        sc.Add(Environment.CurrentDirectory + "''db''Xmain.mdf"); //Bin directory
        sc.Add(Environment.CurrentDirectory + "''db''Xmain_log.ldf");
        sqlServer.AttachDatabase("Xmain", sc);
        Database db = sqlServer.Databases["Xmain"];
        sqlBackup.Initialize = true;
        sqlBackup.Checksum = true;
        sqlBackup.ContinueAfterError = true;
        
        sqlBackup.Devices.Add(deviceItem);
        sqlBackup.Incremental = false;
        sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);
        sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;
        sqlBackup.FormatMedia = false;
        sqlBackup.SqlBackup(sqlServer);

备份数据库mdf&;实体框架

我在这里遗漏了一些东西,需要更多的上下文,但我会咆哮一秒钟,看看是否有什么帮助。

你的意思是备份文件,而不是数据吗?如果是这样,简单的答案是否定的。问题是,当文件连接到数据库服务器(本例中为SQL Express)时,SQL Server会锁定该文件。您可以取消跟踪、复制然后附加,但在此期间应用程序将关闭。这也可以手动完成。

如果你想备份数据,我会考虑在SQL Server中进行计划,而不是编程,除非你不能这样做。备份与其说是程序的一部分,不如说是一种维护功能。

至于数据库名称为空,这是不可能的。事实上,看起来您正在尝试建立一个名为XMain的数据库。

您必须在app.config:中的连接字符串中设置初始目录

<add name="SalaryAndBenefitsEntities" connectionString="metadata=res://*/SalaryAndBenefitsModel.csdl|res://*/SalaryAndBenefitsModel.ssdl|res://*/SalaryAndBenefitsModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.'sqlexpress;attachdbfilename=|DataDirectory|SalaryAndBenefits.mdf;Initial Catalog=SalaryAndBenefit;user instance=true;password=ca;integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

对于备份,请执行以下操作:
创建sql命令内容

 public string BackUpCommand(string databaseName, string fileAddress)
    {
        string command = @"BACKUP DATABASE " + databaseName + @"
                           TO DISK = '" + fileAddress + "' WITH FORMAT";
        return command;
    }

写入备份方法:

public class ActionResult
{
    public bool Result { get; set; }
    public string Message { get; set; }
}
public ActionResult BackUpDatabase(string filePath)
    {
        ActionResult res = new ActionResult { Result = true };
        using (SalaryAndBenefitsEntities _context = new SalaryAndBenefitsEntities())
        {
            string command = "select db_name()";
            string databaseName = _context.Database.SqlQuery(typeof(string), command).ToListAsync().Result.FirstOrDefault().ToString();
            string backUpQuery = BackUpCommand(databaseName, filePath);
            var result = _context.Database.SqlQuery<List<string>>(backUpQuery).ToList();
            if (result.Count() > 0)
            {
                res.Result = false;
                result.ForEach(x =>
                {
                    res.Message += x.ToString();
                });
            }
            return res;
        }
    }

如果返回真实数据库备份成功,则不是

要恢复,请执行以下操作:
创建sql命令内容

public string RestoreCommand(string databaseName, string fileAddress)
    {
        string command = @"use [master]
                        ALTER DATABASE  " + databaseName + @"
                        SET SINGLE_USER
                        WITH ROLLBACK IMMEDIATE
                        RESTORE DATABASE " + databaseName + @"
                        FROM  DISK = N'" + fileAddress + "'";
        return command;
    }

写入还原方法:

 public ActionResult RestoreDatabase(string filePath)
    {
        ActionResult res = new ActionResult { Result = true };
        using (SalaryAndBenefitsEntities _context = new SalaryAndBenefitsEntities())
        {
            string command = "select db_name()";
            string databaseName = _context.Database.SqlQuery(typeof(string), command).ToListAsync().Result.FirstOrDefault().ToString();
            string restoreQuery = RestoreCommand(databaseName, filePath);
            var result = _context.Database.SqlQuery<List<string>>(restoreQuery).ToList();
            if (result.Count() > 0)
            {
                res.Result = false;
                result.ForEach(x =>
                {
                    res.Message += x.ToString();
                });
            }
            return res;
        }
    }

如果返回真实数据库还原成功,则不是

文件路径类似:C:''Temp''backup.bak
filePath(C:''Temp)的目录必须在使用此方法之前手动创建