Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Forzare code-first per inizializzare sempre un database inesistente?

Inizializzatore viene eseguito quando è necessario accedere al database, quindi se si desidera creare un database all'avvio dell'app, utilizzare una delle seguenti opzioni:

    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 ricreerà e facoltativamente re-seed il database con i dati solo se il database non esiste. Per eseguire il seeding del database, crea una classe derivata e sovrascrivi il metodo Seed.

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>());

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

DropCreateDatabaseIfModelChanges Un'implementazione di IDatabaseInitializer che eliminerà, ricreerà e, facoltativamente, reindirizzerà il database con i dati solo se il modello è stato modificato dalla creazione del database. Ciò si ottiene scrivendo un hash del modello del negozio nel database quando viene creato e quindi confrontando quell'hash con uno generato dal modello corrente. Per eseguire il seeding del database, crea una classe derivata e sovrascrivi il metodo Seed.

Database.SetInitializer(nuovo DropCreateDatabaseIfModelChanges());

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

DropCreateDatabaseAlways

Un'implementazione di IDatabaseInitializer che ricreerà sempre e, facoltativamente, ripristinerà il database con i dati la prima volta che un contesto viene utilizzato nel dominio dell'applicazione. Per eseguire il seeding del database, crea una classe derivata e sovrascrivi il metodo Seed.

Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>());

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

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

AGGIORNAMENTO

context.Database.Initialize(true);

Per l'applicazione MVC aggiungi una sezione a Application_Start() metodo nel Global.asax

protected void Application_Start() {

     Database.SetInitializer<MyContext>(new DropCreateDatabaseAlways<MyContext>()); 

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

Inoltre puoi usare un inizializzatore personalizzato:

public class MyDbInit : DropCreateDatabaseAlways<MyContext>
{

}

e poi usa

Database.SetInitializer(new MyDbInit());

AGGIORNAMENTO 2

Crea una nuova applicazione MVC4 vuota chiamata DeleteDBOnEveryRequest .Inserisci 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<BlogContext>(new DropCreateDatabaseAlways<BlogContext>());    

            using (var context = new BlogContext())
            {
                context.Database.Initialize(force: true);
            }    
        }

Crea un nuovo controller chiamato DatabaseController con due azioni.

Nell'Accesso azione si elimina il DB e si reindirizza a Ricreato azione da cui crei un DB poiché era stato precedentemente eliminato.

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 che volevi?