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



作为实体框架部署的一部分,我正在尝试将一些脚本部署到新创建的数据库中,但是出现以下错误;

在多语句事务中不允许更改数据库语句。

我的代码;

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]);");
    }
}

我也尝试了以下内容,确保一次只处理一个事务,并且不在此处显示,而是处理当前上下文并重新创建它;

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");
    }
}

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

最好创建迁移并在其中执行 ALTER。当您的模型和迁移同步时,请在 PM 控制台中运行add-migration EnableQueue。这将为您提供一个空迁移,您现在可以向其中添加自己的语句。

无论如何,在 Seed 方法中的单独事务中运行 SQL 语句是一个有趣的问题。这样的东西应该可以工作(我自己没有编译过,所以里面可能有一些错别字):

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();
  }
}

最新更新