39 votes

Entity Framework Code d'erreur: le modèle de la sauvegarde le contexte a changé depuis la base de données a été créé

J'ai créé un "Code" POCO pour l'utiliser contre une base de données existante à l'aide de Entity Framework 4 et le CTP4. Quand je lance une requête, j'obtiens le message d'erreur

The model backing the 'xyzContext' context has changed since the database was created. Either manually delete/update the database, or call Database.SetInitializer with an IDatabaseInitializer instance. For example, the RecreateDatabaseIfModelChanges strategy will automatically delete and recreate the database, and optionally seed it with new data.

Je suis pas clair sur les raisons de ce qui se passe ou ce que je peux changer. J'ai simplement créé le POCO, a défini une simple DbContext, fait un peu de bricolage, et a ensuite essayé d'exécuter une requête simple. Depuis que je suis en utilisant le Code de "Seulement", je suis pas au courant de tous les paramètres de configuration qui doivent être faits. Et je ne veux certainement pas à recréer ou de supprimer la base de données depuis une base de données existante.

Merci pour toutes les idées.

64voto

Donald Hughes Points 1514

J'ai trouvé la réponse dans les commentaires sur ce post sur le blog de Scott Guthrie.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

Pour ceux qui voient cette exception:

"Le modèle de la sauvegarde de la "Production" contexte a changé depuis la base de données a été créé. Soit manuellement supprimer/mettre à jour la base de données, ou l'appel de la Base de données.SetInitializer avec un IDatabaseInitializer exemple."

Voici ce qui se passe et quoi faire à ce sujet:

Lorsqu'un modèle est créé en premier, nous avons un DatabaseInitializer de faire des choses telles que la création de la base de données si elle n'est pas là ou ajouter des graines de données. La valeur par défaut DatabaseInitializer tente de comparer le schéma de base de données nécessaires pour l'utilisation du modèle avec un hachage du schéma stockées dans une EdmMetadata table est créée avec une base de données (lorsque le Premier Code est celui de la création de la base de données). Les bases de données existantes ne pas avoir la EdmMetadata table et donc de ne pas avoir le hash...et la mise en œuvre d'aujourd'hui va jeter si cette table est manquant. Nous allons travailler sur la modification de ce comportement avant de nous livrer la fial version puisque c'est la valeur par défaut. Jusqu'alors, les bases de données existantes ne sont généralement pas besoin d'une base de données de l'initialiseur de sorte qu'il peut être désactivé pour votre type de contexte en appelant:

Database.SetInitializer<Production>(null);

29voto

Steve Lydford Points 266

C'est un bug dans CTP4 pour l'utilisation EF avec des bases de données existantes.

Vous pouvez résoudre le problème en appelant le:

Database.SetInitializer<YourContext>(null);

dans la méthode Application_Start Mondiale.asax

12voto

rism Points 2864

J'ai fait remarquer ci-dessus et il a travaillé au moment où je viens de jouer avec EF5 à familarise moi-même avec son fonctionnement. Maintenant, je suis en train d'écrire "réelle" de code et j'ai déménagé loin de la définition d'une base de données à initialiser par le contexte dans le code, en raison de l'architecture, j'ai installé sur l'utilisation de la MEF pour instancier tout DbContext et injecter toutes les dépendances de la configuration que composable pièces.

Donc encore une fois, j'ai immédiatement couru dans l'erreur décrite ci-dessus mais cette fois, je choisis de le résoudre en utilisant des 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>

Donc, en définissant disableDatabaseInitialization="true" dans le fichier de configuration de la section pour entityFramework, vous pouvez résoudre l'erreur décrite ci-dessus et comme il n'est pas dans le code l'un des avantages est la possibilité de "plus facile" à utiliser abstraite constructeurs/usines à créer le contexte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: