Entity Framework seed -> SqlException: сброс соединения приводит к состоянию, отличному от первоначального входа в систему.Ошибка входа. - PullRequest
0 голосов
/ 17 мая 2018

Я получаю следующее исключение при запуске метода seed для Entity Framework. Я получаю исключение только один раз, если я запускаю метод seed во второй раз, когда база данных уже была изменена, код работает. Что я могу сделать, чтобы мне не приходилось запускать код дважды при первом создании базы данных? Я не хочу использовать seed и не изменять базу данных с помощью пользовательской миграции.

SqlException: сброс соединения приводит к другому состоянию чем начальный логин. Ошибка входа. Не удалось войти в систему для пользователя ''. Невозможно продолжить выполнение, потому что сеанс находится в уничтожении состояние.

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

Оператор ALTER DATABASE не разрешен в мульти-утверждении сделка.

1 Ответ

0 голосов
/ 18 мая 2018

Вы можете решить эту проблему, используя простое соединение 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();
    }
}
...