C# 实体框架种子部署SQL脚本错误
作为实体框架部署的一部分,我试图将一些脚本部署到新创建的数据库上,但出现以下错误: 多语句事务中不允许使用ALTER DATABASE语句 我的代码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
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();
}
}