Резервное копирование базы данных mdf & Entity Framework - PullRequest
1 голос
/ 07 февраля 2012

У меня есть база данных (файл mdf), к которой я обращаюсь с Entity Framework.Можно ли сделать резервную копию файла 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);

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Я что-то здесь упускаю и мне нужно больше контекста, но я буду разглагольствовать на секунду и посмотреть, будет ли что-нибудь полезное.

Вы имеете в виду на самом деле резервное копирование файла, а не данных? Если так, то простой ответ - нет. Проблема в том, что SQL Server блокирует файл, когда он присоединен к серверу базы данных (в данном случае SQL Express). Вы можете удалить и скопировать, а затем прикрепить, но приложение будет закрыто в течение этого времени. Это также можно сделать вручную.

Если вы хотите сделать резервную копию данных, я бы посоветовал планировать их в SQL Server, а не программно, если только вы не можете сделать это таким образом. Резервное копирование - это скорее функция обслуживания, чем часть программы.

Что касается названия вашей базы данных, то это невозможно. На самом деле, похоже, что вы пытаетесь настроить базу данных под названием XMain.

0 голосов
/ 17 января 2017

Вы должны установить исходный каталог в строке подключения в 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
Каталог filePath (C: \ Temp) должен быть создан вручную перед использованием этого метода

...