Ottengo la seguente eccezione durante l'esecuzione del metodo seed per Entity Framework. Ricevo l'eccezione una volta sola, se eseguo il metodo seed una seconda volta quando il database è già stato modificato, il codice funziona. Cosa posso fare in modo che non sia necessario eseguire il codice due volte durante la creazione del database la prima volta? Non voglio usare seed e non alterare il database usando una migrazione personalizzata.
SqlException: il ripristino della connessione risulta in uno stato diverso rispetto all'accesso iniziale. L'accesso non riesce. Login fallito per utente ''. Impossibile continuare l'esecuzione perché la sessione si trova nello stato kill.
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 }
);
}
Se non utilizzo TransactionalBehavior.DoNotEnsureTransaction
ottengo l'eccezione su context.Database.ExecuteSqlCommand
Istruzione ALTER DATABASE non consentita all'interno di transazioni multi-statement.
È possibile risolvere questo problema utilizzando una semplice connessione ADO.Net, quindi la connessione del contesto non verrà ripristinata:
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();
}
}