【问题标题】:Backup a database mdf & Entity Framework备份数据库 mdf 和实体框架
【发布时间】:2012-02-29 05:58:06
【问题描述】:

我有一个正在使用实体框架的数据库(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);

【问题讨论】:

    标签: c# sql frameworks backup entity


    【解决方案1】:

    我在这里遗漏了一些东西,需要更多的上下文,但我会咆哮一秒钟,看看是否有任何帮助。

    您的意思是实际备份文件,而不是数据?如果是这样,简单的答案是否定的。问题是当文件附加到数据库服务器(本例中为 SQL Express)时,SQL Server 会锁定文件。您可以分离和复制然后附加,但在此期间应用程序将关闭。这也可以手动完成。

    如果你想备份数据,我会考虑在 SQL Server 中安排而不是编程,除非你不能那样做。备份更多的是一种维护功能,而不是程序的一部分。

    至于你的数据库名是空的,那是不可能的。事实上,您似乎正在尝试建立一个名为 XMain 的数据库。

    【讨论】:

      【解决方案2】:

      您必须在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;
              }
          }
      

      如果返回 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) 的目录必须在使用此方法之前手动创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-29
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 2012-03-21
        • 2012-08-09
        相关资源
        最近更新 更多