2012-02-07 160 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:\温度)必须在使用的这个方法之前手动创建