[英]Windows application deployment with SQL Server database and Entity Framework error
[英]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.