Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架种子部署SQL脚本错误_C#_Tsql_Entity Framework 6 - Fatal编程技术网

C# 实体框架种子部署SQL脚本错误

C# 实体框架种子部署SQL脚本错误,c#,tsql,entity-framework-6,C#,Tsql,Entity Framework 6,作为实体框架部署的一部分,我试图将一些脚本部署到新创建的数据库上,但出现以下错误: 多语句事务中不允许使用ALTER DATABASE语句 我的代码 internal sealed class Configuration : DbMigrationsConfiguration<DBContext> { public Configuration() { AutomaticMigrationsEnabled = true; } prote

作为实体框架部署的一部分,我试图将一些脚本部署到新创建的数据库上,但出现以下错误:

多语句事务中不允许使用ALTER DATABASE语句

我的代码

internal sealed class Configuration : DbMigrationsConfiguration<DBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DBContext context)
    {
        context.Database.ExecuteSqlCommand(
            @"ALTER DATABASE MyDB SET ENABLE_BROKER
            CREATE QUEUE NewCarShareQueue;
            CREATE SERVICE NewCarShareService ON QUEUE NewNewCarShareQueue 
               ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);");
    }
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=真;
}
受保护的覆盖无效种子(DBContext上下文)
{
context.Database.ExecuteSqlCommand(
@“ALTER DATABASE MyDB SET ENABLE_BROKER
创建队列NewCarShareQueue;
在队列NewCarShareQueue上创建服务NewCarShareService
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);");
}
}
我也尝试了以下方法,确保一次只处理一个事务,这里没有显示,而是处理当前上下文并重新创建它

internal sealed class Configuration : DbMigrationsConfiguration<DBContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(DBContext context)
    {
        context.SaveChanges();
        context.Database.ExecuteSqlCommand(
           @"ALTER DATABASE MyDB SET ENABLE_BROKER");
    }
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=真;
}
受保护的覆盖无效种子(DBContext上下文)
{
SaveChanges();
context.Database.ExecuteSqlCommand(
@“ALTER DATABASE MyDB SET ENABLE_BROKER”);
}
}

在每次成功运行迁移后,都会运行
Seed
命令。即使没有挂起的迁移,它实际上也会运行。因此,这是一个不好的地方做任何改变的数据库结构

最好创建一个迁移并在其中进行更改。当模型和迁移同步时,在PM控制台中运行
添加迁移启用队列
。这将为您提供一个空迁移,您现在可以将自己的语句添加到其中

无论如何,在
Seed
方法中的单独事务中运行SQL语句是一个有趣的问题。类似的东西应该可以使用(我自己还没有编译过,所以可能有一些拼写错误):


如果删除TransactionScope,则此操作有效。否则,我会得到相同的错误:“多语句事务中不允许使用ALTER DATABASE语句”
protected override void Seed(DBContext context)
{
  using(var tx = new TransactionScope(TransactionScopeOption.RequiresNew))
  using(var conn = new SqlConnection(context.Database.Connection.ConnectionString))
  {
    conn.Open()
    var command = conn.CreateCommand();
    command.CommandText = "ALTER DATABASE WHATEVER YOU WANT TO DO";
    command.ExecuteNonQuery();

    tx.Complete();
  }
}