簡體   English   中英

實體框架種子部署SQL腳本錯誤

[英]Entity Framework Seed Deployment SQL Script error

作為實體框架部署的一部分,我試圖將一些腳本部署到新創建的數據庫中,但是出現以下錯誤;

多語句事務中不允許使用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]);");
    }
}

我也嘗試了以下方法,以確保一次僅處理一次事務,此處未顯示,但處理了當前上下文並重新創建了它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM