Entity Framework CTP4: où placer SetInitializer?

.net asp.net-mvc-2 c# entity-framework

Question

J'essaie d'ajouter Entity Framework, le code en premier, à une application MVC exécutée avec des données de test, à l'aide de l'aperçu CTP4.

Je reçois actuellement cette erreur:

Le modèle sauvegardant le contexte 'SchedulerContext' a été modifié depuis la création de la base de données. Supprimez / mettez à jour manuellement la base de données ou appelez Database.SetInitializer avec une instance IDatabaseInitializer. Par exemple, la stratégie RecreateDatabaseIfModelChanges supprime et recrée automatiquement la base de données et, éventuellement, l'ensemence de nouvelles données.

Je ne veux pas du tout générer une base de données, car j'ai déjà une base de données. J'ai donc essayé d'ajouter ce qui suit au constructeur SchedulerContext:

Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());

qui n'a eu aucun effet du tout - j'ai eu la même erreur la prochaine fois qu'il a couru. L’erreur semble se produire lorsqu’il exécute une instruction LINQ qui accède à la base de données - la première, je pense.

Où devrais-je placer cette déclaration, ou cette déclaration est-elle la solution à ce problème?

Réponse acceptée

Mettre à jour

J'ai simplement passé sous silence le fait que vous avez déjà une base de données et que vous ne voulez pas en créer une autre ... dans ce cas, la réponse est de la mettre dans votre classe SchedulerContext

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
    modelBuilder.IncludeMetadataInDatabase = false;
}

Ancienne réponse

Vous le mettez habituellement dans le Global.asax

protected void Application_Start() {
    Database.SetInitializer<SchedulerContext>(new CreateDatabaseOnlyIfNotExists<SchedulerContext>());
}

Notez qu'il ne sera initialisé qu'à la première utilisation du contexte de données.

Mettre à jour

public class DataContextInitializer : CreateDatabaseOnlyIfNotExists<SchedulerContext> {
    protected override void Seed(SchedulerContext context) {
    }
}

Ensuite, vous modifiez le SetInitializer comme suit.

System.Data.Entity.Infrastructure.Database.SetInitializer<SchedulerContext>(new  DataContextInitializer());

Réponse populaire

Btw, à partir de CTP5, c’est la bonne façon de régler l’initialiseur dans Global.asax

protected void Application_Start() { System.Data.Entity.Database.DbDatabase.SetInitializer<NerdDinners>(new System.Data.Entity.Database.DropCreateDatabaseIfModelChanges<NerdDinners>()); }



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow