簡體   English   中英

備份數據庫MDF和實體框架

[英]Backup a database mdf & Entity Framework

我有一個要連接實體框架的數據庫(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);

我在這里遺漏了一些東西,需要更多上下文,但是我會花一秒鍾,看看是否有什么幫助。

您是說實際上備份文件而不是數據嗎? 如果是這樣,簡單的答案是否定的。 問題在於,當SQL Server將文件附加到數據庫服務器(在這種情況下為SQL Express)時,它將鎖定該文件。 您可以分離並復制然后附加,但是在此期間應用程序將關閉。 也可以手動完成。

如果要備份數據,我將考慮在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;
        }
    }

如果返回true,則數據庫備份成功,否則不成功

要還原,請執行以下操作:
創建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;
        }
    }

如果返回true,則數據庫還原成功,否則不成功

filePath像:C:\\ Temp \\ backup.bak
使用此方法之前,必須手動創建filePath目錄(C:\\ Temp)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM