[英]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="data source=.\sqlexpress;attachdbfilename=|DataDirectory|SalaryAndBenefits.mdf;Initial Catalog=SalaryAndBenefit;user instance=true;password=ca;integrated security=SSPI;MultipleActiveResultSets=True;App=EntityFramework"" 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.