备份数据库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);
我在这里遗漏了一些东西,需要更多的上下文,但我会咆哮一秒钟,看看是否有什么帮助。
你的意思是备份文件,而不是数据吗?如果是这样,简单的答案是否定的。问题是,当文件连接到数据库服务器(本例中为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="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;
}
}
如果返回真实数据库备份成功,则不是
要恢复,请执行以下操作:
创建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)的目录必须在使用此方法之前手动创建