web-dev-qa-db-fra.com

Entity Framework ne crée pas de base de données

Joué avec la fonctionnalité Code First de Entity Framework 4.1 en utilisant un projet ASP.NET MVC 3.

Toutefois, la base de données (SQL Server 2008 R2) ne crée pas automatiquement le mappage de table au démarrage de l'application. Des idées sur la façon de le faire?

Le projet a un seul 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; }
    }
}

Il a également la classe de contexte de base de données suivante:

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

J'ai ajouté une chaîne de connexion SQL au fichier global web.config comme suit:

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

Il existe également une instruction explicite pour créer la base de données si elle n’existe pas dans le fichier Global.asax.cs:

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

    AreaRegistration.RegisterAllAreas();

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

Interrogé à la place sur les forums MSDN, il a obtenu une réponse satisfaisante:

Entity Framework ne créera pas de base de données avant le premier accès. Le bloc de code actuel dans Application_Start() spécifie uniquement la stratégie à utiliser lors de la création de la base de données lors du premier accès.

Pour déclencher la création de la base de données au démarrage, une instance du contexte de la base de données doit être créée et context.Database.Initialize(true) doit être appelé.

65
mazatsushi

J'ai le même problème et j'ai trouvé une solution élégante: appelez SetInitializer dans le constructeur de votre DbContext:

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

Mon paramètre d'application: 

<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

Je sais que mazatsushi a déjà répondu à cette question de la manière la plus juste… .. Mais juste pour le clarifier aux débutants:

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

à l'intérieur de la fonction Application_Start () dans Global.asax.cs et Boom! travaux!

0
Letie Techer