Forzare il codice per inizializzare sempre un database inesistente?

A volte, cancellerò il mio database di sviluppo ed eseguirò la mia prima applicazione con codice EF. Otterrò l’errore:

Imansible aprire il database “AssessmentSystem” richiesto dal login. L’accesso non è riuscito. Accesso non riuscito per l’utente ‘AssessmentAdmin’.

Penso che questo sia dovuto al fatto che DbContext esegue la logica di inizializzazione del DB “una volta per AppDomain quando il contesto viene utilizzato per la prima volta”, come dice questa pagina . Ciò significa che è necessario riciclare il pool di applicazioni IIS per consentire a EF di ricreare il mio database se lo rilascia.

C’è un modo per ottenere il codice di inizializzazione del DB da eseguire ogni volta che provo ad accedere al database? Quindi, controllerà sempre per vedere se il DB esiste e, in caso contrario, crearlo invece di provare ad aprirlo, anche se sta usando lo stesso AppDomain che in precedenza aveva accesso al database che ora ho abbandonato?

Si noti che mi piacerebbe che questo controllo di inizializzazione fosse eseguito su ogni query , quindi anche averlo fatto in Application_Start non è abbastanza spesso; idealmente, mi piacerebbe essere in grado di caricare alcuni dati DB, cancellare il DB, quindi caricare alcuni dati DB e ricreare il DB senza che io debba riavviare l’applicazione (in pratica dovrei semplicemente ricaricare la pagina web che carica alcuni dati DB).

Initializer viene eseguito quando è necessario accedere al database, quindi se si desidera creare un database all’avvio dell’app, utilizzare qualsiasi cosa tra le seguenti:

  context.Database.Initialize(true); //If set to true the initializer is run even if it has already been run. context.Database.Create() 

http://msdn.microsoft.com/en-us/library/system.data.entity.database.initialize(v=vs.103).aspx

CreateDatabaseIfNotExists Un’implementazione di IDatabaseInitializer che consente di ricreare e facoltativamente ri-seed del database con i dati solo se il database non esiste. Per seminare il database, creare una class derivata e sovrascrivere il metodo Seed.

 Database.SetInitializer(new CreateDatabaseIfNotExists()); 

http://msdn.microsoft.com/en-us/library/gg679221(v=vs.103).aspx

DropCreateDatabaseIfModelChanges Un’implementazione di IDatabaseInitializert che elimina, ricrea e facoltativamente ri-seed del database con i dati solo se il modello è stato modificato da quando è stato creato il database. Ciò si ottiene scrivendo un hash del modello di negozio nel database quando viene creato e confrontando l’hash con uno generato dal modello corrente. Per seminare il database, creare una class derivata e sovrascrivere il metodo Seed.

La strategia di inizializzazione può facoltativamente verificare l’esistenza del database, creare un nuovo database e inizializzare il database con i dati. La strategia predefinita è un’istanza di CreateDatabaseIfNotExists.

Database.SetInitializer (new DropCreateDatabaseIfModelChanges ());

Nota che questo presuppone che tu abbia il permesso di abbandonare il tuo database.

http://msdn.microsoft.com/en-us/library/gg679604(v=vs.103).aspx

DropCreateDatabaseAlways

Un’implementazione di IDatabaseInitializer che ricrea sempre e facoltativamente ri-seed del database con i dati la prima volta che viene utilizzato un contesto nel dominio dell’applicazione. Per seminare il database, creare una class derivata e sovrascrivere il metodo Seed.

 Database.SetInitializer(new DropCreateDatabaseAlways()); 

http://msdn.microsoft.com/en-us/library/gg679506(v=vs.103).aspx

Ti consiglio di guardare le Migrazioni se vuoi monitorare, ripristinare le modifiche apportate al tuo DB allo stato precedente http://msdn.microsoft.com/hr-hr/data/jj591621 .

AGGIORNARE

 context.Database.Initialize(true); 

Se la forza del parametro è impostata su true, l’inizializzatore viene eseguito indipendentemente dal fatto che sia stato eseguito prima o meno. Questo può essere utile se un database viene eliminato mentre un’app è in esecuzione e deve essere reinizializzata.

Per l’applicazione MVC aggiungere una sezione al metodo Application_Start() in Global.asax

 protected void Application_Start() { Database.SetInitializer(new DropCreateDatabaseAlways()); // Forces initialization of database on model changes. using (var context= new MyContext()) { context.Database.Initialize(force: true); } } 

Inoltre è ansible utilizzare un inizializzatore personalizzato:

 public class MyDbInit : DropCreateDatabaseAlways { } 

e quindi usare

 Database.SetInitializer(new MyDbInit()); 

AGGIORNAMENTO 2

Crea una nuova applicazione MVC4 vuota chiamata DeleteDBOnEveryRequest . Inserire quanto segue in Global.asax Application_start

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); Database.SetInitializer(new DropCreateDatabaseAlways()); using (var context = new BlogContext()) { context.Database.Initialize(force: true); } } 

Crea un nuovo controller chiamato DatabaseController con due azioni.

Nell’azione di accesso si elimina il DB e si esegue il reindirizzamento all’azione Ricreata da cui si crea un DB poiché era precedentemente cancellato.

 namespace DeleteDBOnEveryRequest.Controllers { public class DatabaseController : Controller { public ActionResult Access() { using (var context = new BlogContext()) { context.Database.Delete(); } return RedirectToAction("Recreated"); } public ActionResult Recreated() { using (var context = new BlogContext()) { context.Database.Initialize(force: true); } return View(); } } } 

Questo è quello che volevi?