web-dev-qa-db-fra.com

Erreur Entity Framework Code Only: le modèle sauvegardant le contexte a changé depuis la création de la base de données

J'ai créé un POCO "Code uniquement" pour une utilisation avec une base de données existante en utilisant Entity Framework 4 et le CTP4. Lorsque j'exécute une requête, j'obtiens l'erreur

Le modèle soutenant le contexte 'xyzContext' a changé 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 supprimera et recréera automatiquement la base de données et éventuellement l'amorcera avec de nouvelles données.

Je ne sais pas pourquoi cela se produit ou ce que je peux changer. J'ai simplement créé le POCO, défini un simple DbContext, fait quelques ajustements, puis essayé d'exécuter une requête simple. Étant donné que j'utilise "Code uniquement", je ne suis au courant d'aucun paramètre de configuration à effectuer. Et je ne veux certainement pas recréer ou supprimer la base de données car c'est une base de données existante.

Merci pour toutes les idées.

50
Donald Hughes

Il s'agit d'un bogue dans CTP4 pour utiliser EF avec des bases de données préexistantes.

Vous pouvez le corriger en appelant:

Database.SetInitializer<YourContext>(null);

dans la méthode Application_Start de Global.asax

31
Steve Lydford

J'ai commenté ci-dessus et cela a fonctionné au moment où je jouais avec EF5 pour me familiariser avec son fonctionnement. Maintenant, j'écris du code "réel" et je me suis éloigné de la définition d'un initialiseur de base de données par contexte dans le code en raison d'une architecture sur laquelle j'ai décidé d'utiliser MEF pour instancier tout DbContext et injecter toutes les dépendances de configuration en tant que parties composables.

Encore une fois, j'ai immédiatement rencontré l'erreur décrite ci-dessus, mais cette fois, j'ai choisi de la résoudre en utilisant les entrées du fichier de configuration comme ci-dessous.

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
    <contexts>
      <context type="Basd.Erp.ContactContext, Basd.Erp" disableDatabaseInitialization="true"></context>
    </contexts>
  </entityFramework>

Ainsi, en définissant disableDatabaseInitialization = "true" dans la section du fichier de configuration pour entityFramework, vous pouvez surmonter l'erreur décrite ci-dessus et comme ce n'est pas dans le code, l'un des avantages est la possibilité d'utiliser "plus facilement" des constructeurs/usines abstraits pour créer le contexte.

13
rism

Tout ce que j'avais à faire était de supprimer la table __MigrationHistory.

Le contexte:

J'ai reçu cette erreur lorsque j'ai changé le nom d'une table. Après avoir ajouté l'annotation [Table("NewTableName")] à l'un de mes modèles, Entity Framework a généré une table __MigrationHistory.

4
Jared Beach

J'ai eu le même problème - rajouter la migration et mettre à jour la base de données n'a pas fonctionné et aucune des réponses ci-dessus ne semblait correcte. Puis l'inspiration m'a frappé - j'utilise plusieurs niveaux (un Web, une donnée et une entreprise). La couche Web n'a jamais levé cette exception - c'était la couche métier (que j'ai définie comme application console pour les tests et le débogage). Il s'avère que la couche métier n'utilisait pas la bonne chaîne de connexion pour obtenir la base de données et créer le contexte. J'ai donc ajouté la chaîne de connexion à la configuration de l'application et à l'alto, cela fonctionne. Mettre ceci ici pour d'autres qui peuvent rencontrer le même problème.

1
Richard Barker