原因分析
EF中的Database.ExecuteSqlCommand执行sql命令时自动将sql命名包装为一个事务,然而SQL Server数据库中不允许在事务内执行备份或还原操作,发生冲突,故报错。
解决思路
让Database.ExecuteSqlCommand执行sql命令时不将sql命名包装为一个事务,而是直接执行sql命令。
解决办法
Database.ExecuteSqlCommand方法有两个重载,使用另外一个重载方法
Database.ExecuteSqlCommand(System.Data.Entity.TransactionalBehavior transactionalBehavior, string sql, params object[] parameters);
将第一个形参System.Data.Entity.TransactionalBehavior transactionalBehavior设置为System.Data.Entity.TransactionalBehavior.DoNotEnsureTransaction,问题解决。
官方对System.Data.Entity.TransactionalBehavior.DoNotEnsureTransaction的解释为:
如果存在现有事务,则使用它,否则在没有事务的情况下执行命令或查询。