wake-up-neo.com

Entity Framework erstellt keine Datenbank

Haben Sie mit dem Code First-Feature von Entity Framework 4.1 mit einem ASP.NET MVC 3-Projekt herumgespielt.

Die Datenbank (SQL Server 2008 R2) erstellt die Tabellenzuordnung jedoch nicht automatisch beim Start der Anwendung. Irgendwelche Ideen, wie man das machen soll?

Das Projekt hat nur ein POCO:

namespace RIS.Models
{
    public class Person
    {
        [Key]
        public virtual string NRIC { get; protected set; }
        public virtual string FirstName { get; protected set; }
        public virtual string MiddleName { get; protected set; }
        public virtual string LastName { get; protected set; }
    }
}

Es hat auch die folgende Datenbankkontextklasse:

namespace RIS.Models
{
    public class RIS_DB : DbContext
    {
        public DbSet<Person> People { get; set; }
    }
}

Ich habe der globalen Datei web.config wie folgt eine SQL-Verbindungszeichenfolge hinzugefügt:

<add name="RIS_DB" connectionString="Data Source=URAHARA-PC;Initial Catalog=RIS_DB;
Integrated Security=SSPI;Pooling=False" providerName="System.Data.SqlClient"/>

Es gibt auch eine explizite Anweisung zum Erstellen der Datenbank, falls sie nicht in der Datei Global.asax.cs vorhanden ist:

protected void Application_Start()
{
    Database.SetInitializer(new CreateDatabaseIfNotExists<RIS_DB>());

    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
32
mazatsushi

Stattdessen in den MSDN-Foren nachgefragt und eine befriedigende Antwort erhalten:

Entity Framework erstellt erst beim ersten Zugriff eine Datenbank. Der aktuelle Codeblock in Application_Start() gibt nur die Strategie an, die beim Erstellen der Datenbank beim ersten Zugriff verwendet werden soll.

Um die Erstellung der Datenbank beim Start auszulösen, muss eine Instanz des Datenbankkontexts erstellt und context.Database.Initialize(true) aufgerufen werden.

65
mazatsushi

Ich habe das gleiche Problem und habe eine elegante Lösung gefunden: Rufen Sie den SetInitializer im Konstruktor Ihres DbContext auf:

public class MyDbContext : DbContext
{
   protected MyDbContext : this("MyConnection")
   {
       Database.SetInitializer<MyDbContext>(new CreateDatabaseIfNotExists<MyDbContext>());
   }
}

Meine App-Einstellung: 

<connectionStrings>
    <add
      name="MyConnection"
      connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\MyDB.mdf;Initial Catalog=MyDB;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
3
Maksood

Ich weiß, dass dies von Mazatsushi auf die richtige Art und Weise bereits beantwortet wurde ... Aber um es den Anfängern zu erklären:.

        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SorteoContext>());
        using (var context = new SorteoContext())
        {
            context.Database.Initialize(force: true);
        }

inside Application_Start () - Funktion in Global.asax.cs und Boom! funktioniert!

0
Letie Techer