2012-02-07 153 views
1

我有一個數據庫(mdf文件),我正在與實體框架接近。是否可以對MDF文件進行備份? 我已經嘗試過但SMO,但問題是因爲我使用的是一個mdf文件數據庫名稱爲空。我讀過它是自動生成的。備份數據庫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); 

回答

1

我在這裏失去了一些東西,需要更多的背景,但我會咆哮上一秒鐘,看看是否有什麼是有幫助的。

你的意思是實際備份文件,而不是數據?如果是這樣,簡單的答案是否定的。問題是,當SQL Server連接到數據庫服務器(本例中爲SQL Express)時,它將鎖定該文件。您可以加密並複製然後附加,但在此期間應用程序將停止運行。這也可以手動完成。

如果你想備份數據,我會考慮在SQL Server中安排它,而不是編程,除非你不能這樣做。備份比程序的一部分更具維護功能。

至於你的數據庫名稱是空的,這是不可能的。實際上,它看起來像是在試圖建立一個名爲XMain的數據庫。

0

您必須在設定的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; 
     } 
    } 

如果迴歸真正的數據庫恢復是否則不成功

filePath像:C:\ TEMP \ backup.bak
文件路徑的目錄(C:\溫度)必須在使用的這個方法之前手動創建