实体框架种子 -> SqlException:重置连接会导致与初始登录不同的状态。登录失败。



我在运行实体框架的种子方法时出现以下异常。我只收到一次异常,如果我在数据库已经被更改时第二次运行 seed 方法,代码就可以工作。我该怎么做才能在第一次创建数据库时不必运行代码两次?我不想使用种子,也不想使用自定义迁移更改数据库。

Sql异常:重置连接会导致不同的状态 比初始登录。登录失败。用户"登录失败。 无法继续执行,因为会话处于终止状态 州。

protected override void Seed(Repositories.EntityFramework.ApplicationDbContext context)
{
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, 
string.Format("ALTER DATABASE [{0}] COLLATE Latin1_General_100_CI_AS", context.Database.Connection.Database));
//Exception here
context.Roles.AddOrUpdate(
role => role.Name,
new ApplicationRole() { Name = RoleConstants.SystemAdministrator }
);
}

如果我不使用TransactionalBehavior.DoNotEnsureTransaction我会得到异常context.Database.ExecuteSqlCommand

多语句中不允许更改数据库语句 交易。

您可以使用纯 ADO.Net 连接来解决此问题,因此不会重置上下文的连接:

using (var conn = new SqlConnection(context.Database.Connection.ConnectionString))
{
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = 
string.Format("ALTER DATABASE [{0}] COLLATE Latin1_General_100_CI_AS",
context.Database.Connection.Database));
conn.Open();
cmd.ExecuteNonQuery();
}
}

最新更新