Prima di tutto non sono un esperto di SQL ....
La mia ipotesi è: non lasciare che nessun utente dell'applicazione acceda a masterdb.
Almeno questa è l'impostazione predefinita che di solito utilizzo sul nostro host SQL Azure SaaS condiviso.
Preparo vari suggerimenti che ti dicono di farlo:
Database.SetInitializer<AppDataContext>(null);
A mio parere, tuttavia, disabilita completamente le migrazioni automatiche .
Voglio migrazioni automatiche (schema): non voglio che EF crei un nuovo database (o controlli l'esistenza del database rispetto a masterdb).
Qual è la soluzione giusta a questo?
Aggiornamento 1: Non ho decompilato le sorgenti ma ho guardato invece l'implementazione mono di MigrateDatabaseToLatestVersion
.
/// <inheritdoc />
public void InitializeDatabase(TContext context)
{
Check.NotNull(context, "context");
var migrator = new DbMigrator(_config);
migrator.Update();
}
... e migrator.Update (); lo farà ... con targetMigration nullo.
public override void Update(string targetMigration)
{
base.EnsureDatabaseExists(() => UpdateInternal(targetMigration));
}
In pratica chiamerà UpdateInternal () - che si occupa solo delle migrazioni. Nessuna chiamata di esistenza del database, giusto? Lo esaminerò.
Aggiornamento 2:
Posso vedere la seguente chiamata:
IF db_id(N'my-database') IS NOT NULL SELECT 1 ELSE SELECT Count(*) FROM sys.databases WHERE [name]=N'my-database'
Ma va bene - per questo non è richiesto l'accesso al database principale.
La mia comprensione è che questo è un bug in Entity Framework. Vedi la segnalazione di bug qui dal dipendente MS sul loro GitHub
"... sembra che ci sia un problema con il controllo dell'esistenza del database eseguito da DbMigrator - sta tentando di connettersi al database master, che non riesce. Avevamo aggiornato gli altri controlli di esistenza per non averlo richiesto, ma sembra che DbMigrator sia mancato o c'è qualche ragione per cui non si può fare qui ... "