![](/img/trans.png)
[英]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.