Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Code-First zwingen, immer eine nicht vorhandene Datenbank zu initialisieren?

Initialisierer wird ausgeführt, wenn Sie auf die Datenbank zugreifen müssen. Wenn Sie also eine Datenbank beim App-Start erstellen möchten, verwenden Sie Folgendes:

    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 Eine Implementierung von IDatabaseInitializer, die die Datenbank nur dann neu erstellt und optional erneut mit Daten versorgt, wenn die Datenbank nicht vorhanden ist. Erstellen Sie zum Seeding der Datenbank eine abgeleitete Klasse und überschreiben Sie die Seed-Methode.

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

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

DropCreateDatabaseIfModelChanges Eine Implementierung von IDatabaseInitializer, die die Datenbank nur löscht, neu erstellt und optional erneut mit Daten versorgt, wenn sich das Modell seit der Erstellung der Datenbank geändert hat. Dies wird erreicht, indem ein Hash des Geschäftsmodells in die Datenbank geschrieben wird, wenn es erstellt wird, und dieser Hash dann mit einem Hash verglichen wird, der aus dem aktuellen Modell generiert wurde. Erstellen Sie zum Seeding der Datenbank eine abgeleitete Klasse und überschreiben Sie die Seed-Methode.

Database.SetInitializer(new DropCreateDatabaseIfModelChanges());

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

DropCreateDatabaseAlways

Eine Implementierung von IDatabaseInitializer, die die Datenbank immer neu erstellt und optional erneut mit Daten versorgt, wenn ein Kontext zum ersten Mal in der Anwendungsdomäne verwendet wird. Erstellen Sie zum Seeding der Datenbank eine abgeleitete Klasse und überschreiben Sie die Seed-Methode.

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

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

Ich empfehle Ihnen, sich Migrationen anzusehen Wenn Sie nachverfolgen möchten, setzen Sie die Änderungen, die Sie an Ihrer Datenbank vorgenommen haben, auf den vorherigen Zustand zurück http ://msdn.microsoft.com/hr-hr/data/jj591621 .

AKTUALISIEREN

context.Database.Initialize(true);

Fügen Sie für MVC-Anwendungen einen Abschnitt zu Application_Start() hinzu -Methode in 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);
     }    
}

Sie können auch einen benutzerdefinierten Initialisierer verwenden:

public class MyDbInit : DropCreateDatabaseAlways<MyContext>
{

}

und dann verwenden

Database.SetInitializer(new MyDbInit());

AKTUALISIERUNG 2

Erstellen Sie eine neue leere MVC4-Anwendung namens DeleteDBOnEveryRequest .Fügen Sie Folgendes in Global.asax Application_start

ein
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);
            }    
        }

Erstellen Sie einen neuen Controller namens DatabaseController mit zwei Aktionen.

Im Zugang Aktion löschen Sie die DB und leiten zu Neu erstellt weiter Aktion, in der Sie eine Datenbank erstellen, wie sie zuvor gelöscht wurde.

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();
        }
    }
}

Wollten Sie das?