Le message d'erreur:
"Le modèle qui soutient le contexte" AddressBook "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 le semer avec de nouvelles données. "
J'essaie d'utiliser la fonctionnalité de code en premier et voici ce que j'ai écrit:
var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
var contact = new Contact
{
ContactID = 10000,
FirstName = "Brian",
LastName = "Lara",
ModifiedDate = DateTime.Now,
AddDate = DateTime.Now,
Title = "Mr."
};
context.contacts.Add(contact);
int result = context.SaveChanges();
Console.WriteLine("Result :- "+ result.ToString());
}
La classe de contexte:
public class AddressBook : DbContext
{
public AddressBook()
{ }
public AddressBook(DbModel AddressBook)
: base(AddressBook)
{
}
public DbSet<Contact> contacts { get; set; }
public DbSet<Address> Addresses { get; set; }
}
et la chaîne de connexion:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="AddressBook" providerName="System.Data.SqlClient"
connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
Integrated Security=True;MultipleActiveResultSets=True;"/>
</connectionStrings>
</configuration>
Ainsi, le nom de la base de données est "Carnet d'adresses" et l'erreur se produit lorsque j'essaie d'ajouter l'objet contact au contexte. Suis-je en train de manquer quelque chose ici?
.net
entity-framework-4
code-first
Ashish Gupta
la source
la source
Réponses:
Maintenant c'est:
dans votre fichier YourDbContext.cs.
la source
Voici quelques informations du blog de Scott Gu publiées par Jeff sur ce qui se passe réellement:
la source
Invalid object name 'dbo.Table
vérification de votre chaîne de connexion attachDbFilename et catalogue initialPour Entity Framework 5.0.0.0 - 6.1.3
Vous N'ÊTES voulez bien faire ce qui suit:
Oui, Matt Frear a raison. UPDATE -EDIT: La mise en garde est que je suis d'accord avec les autres en ce que au lieu d'ajouter ce code à global.asax ajouté à votre classe DbContext
Comme d'autres l'ont mentionné, cela est également bon pour gérer les tests unitaires.
Actuellement, j'utilise ceci avec Entity Framework 6.1.3 /.net 4.6.1
Je reviendrai pour fournir un extrait CORE dans un avenir proche.
la source
Exécutez simplement la commande sqowng sqowng dans SQL Server Management Studio:
la source
Ce correctif ne fonctionne plus après CTP5.
Tu dois faire
Database.SetInitializer<YourContext>(null);
la source
Je viens de découvrir la réponse et j'ai pensé à mettre à jour ici. Il suffit de faire ce qui suit.
la source
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
n'aide pas non plus la situation. DbDatabase.SetInitialzer (null); fonctionne.Ou vous pouvez mettre cette ligne dans votre fichier Global.asax.cs sous Application_Start ():
Assurez-vous de modifier ProjectName.Path.Context en votre espace de noms et votre contexte. Si vous utilisez d'abord du code, cela supprimera et créera une nouvelle base de données chaque fois que des modifications seront apportées au schéma.
la source
J'ai passé plusieurs jours à résoudre ce problème, analysé de nombreux messages différents et essayé de nombreuses options et finalement corrigé. Ces 2 projets dans ma solution utilisant les premières migrations de code EF:
J'ai eu cette erreur lorsque demandé WebApi ...
Mon environnement:
Ici, j'ai rassemblé toutes les remarques auxquelles vous devez prêter attention et toutes les conditions / exigences qui doivent être remplies, pour éviter l'exception mentionnée:
Nom de la chaîne de connexion, par exemple MyConnectionString dans le fichier de configuration du projet de démarrage (Web.config / App.config):
doit être égal au paramètre passé dans le constructeur de votre DbContext:
Et le principal, qui a résolu mon problème: c'est bizarre, mais dans mon dossier WebApi / bin, DataModel.exe était vieux, pas actualisé depuis la dernière version. Étant donné que les migrations étaient intégrées dans mon assembly DataModel.exe, ma base de données WebApi a été mise à jour à l'aide d'anciennes mirgations. J'étais confus pourquoi après la mise à jour de la base de données dans WebApi, cela ne correspond pas au dernier script de migration de DataModel. Le code suivant crée automatiquement (s'il n'existe pas) ou met à jour la dernière base de données locale de migration dans mon dossier WebApi / App_Data.
J'ai essayé de nettoyer et de reconstruire la solution mais cela n'a pas aidé, j'ai complètement supprimé les dossiers bin et obj de WebApi, supprimé les fichiers de base de données de WebApi / App_Data, construit, redémarré WebApi, fait une demande, il a créé une base de données correcte - initialisation paresseuse (à l'aide de lignes ci-dessus), ce qui correspond à la dernière migration et l'exception n'apparaît plus. Ainsi, cela peut résoudre votre problème:
la source
Pour moi, avec la mise à niveau vers 4.3.1, je viens de tronquer la table EdmMetaData ou de la supprimer purement et simplement.
la source
Pour les développeurs VB.NET:
Ajoutez la ligne suivante au fichier Glabal.asax.vb, à la fin de la méthode Application_Start ()
Remplacez ApplicationDbContext par votre contexte Db spécifique.
la source
J'ai eu ce problème et il s'est avéré qu'un projet pointait vers SQLExpress mais celui avec le problème pointait vers LocalDb. (dans leur web.config respectif). Supervision idiote mais mérite d'être notée ici au cas où quelqu'un d'autre dépannerait ce problème.
la source
Cela signifie qu'il y a eu quelques changements sur le contexte qui n'ont pas été exécutés. Veuillez d'abord exécuter Add-Migration pour générer les modifications que nous avons apportées (les modifications que nous ne connaissons peut-être pas), puis exécutez Update-Database
la source
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 de données a le contexte et tous les modèles. 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 de la couche métier (et de la couche de données) et de l'alto que cela fonctionne. Mettre ceci ici pour d'autres qui peuvent rencontrer le même problème.
la source
J'utilise la méthode Database.CompatibleWithModel (disponible dans EF5) pour tester si le modèle et la base de données correspondent avant de l'utiliser. J'appelle cette méthode juste après avoir créé le contexte ...
la source
Une bonne suggestion, cependant, n'est pas si précise dans tous les cas. J'en trouve un. Veuillez vous assurer que vous exécutez «enable-migrations» à l'aide de fenêtres PM dans Visual Studio, et le dossier de migration sera ajouté à votre projet.
Assurez-vous que les deux fichiers de classe c # ajoutés au dossier sur contiendront tous vos modèles et leurs propriétés respectives.
Si vous avez tout cela, créez la solution et publiez pour le déploiement.
La logique est que les métadonnées existantes ne peuvent pas être écrasées car votre application n'a pas de métadonnées pour remplacer l'actuelle. Par conséquent, vous obtenez cette erreur "Le modèle qui soutient le contexte a changé depuis la création de la base de données"
la source
Juste au cas où quelqu'un aurait le même scénario que le mien.
J'ai la première base de données EF et en même temps en utilisant l'identité asp.net
j'ai donc deux connectionStrings dans mon webconfig, et il n'y a aucun problème avec cela. Il est arrivé que j'ai créé / exécuté les scripts pour générer manuellement les tables d'identité asp.net que je ne devrais pas.
donc DROP d'abord toutes les tables d'identité asp.net créées par vous manuellement / à partir de scripts.
la source
Aucune de ces solutions ne fonctionnerait pour nous (à part désactiver complètement la vérification du schéma). Au final, nous avons eu un match raté dans notre version de Newtonsoft.json
Notre AppConfig n'a pas été mis à jour correctement:
La solution était de corriger la version d'assemblage à celle que nous déployions réellement
la source
Après quelques recherches sur ce sujet, j'ai constaté que l'erreur se produit essentiellement si vous avez une instance de db créée précédemment sur votre serveur sql local express. Donc, chaque fois que vous avez des mises à jour sur db et essayez de mettre à jour la db / exécutez du code sur db sans exécuter la
Update Database
commande usingPackage Manager Console
; tout d'abord, vous devez supprimer manuellement la base de données précédente sur notre sql express local.En outre, cette solution fonctionne sauf si vous en avez
AutomaticMigrationsEnabled = false;
dans votre configuration.Si vous travaillez avec un système de contrôle de version (git, svn, etc.) et que certains autres développeurs mettent à jour les objets db en phase de production, cette erreur se produit chaque fois que vous mettez à jour votre base de code et exécutez l'application.
Comme indiqué ci-dessus, il existe certaines solutions pour cela sur la base de code. Cependant, c'est le plus pratique pour certains cas.
la source
Je lis également le livre Pro ASP.NET MVC 4 et j'ai rencontré le même problème que vous rencontriez. Pour moi, j'ai commencé à avoir le problème après avoir apporté les modifications prescrites dans la section «Ajout de validation de modèle» du livre. La façon dont j'ai résolu le problème consiste à déplacer ma base de données de la base de données locale vers le serveur SQL Server 2012 à part entière. (BTW, je sais que j'ai de la chance de pouvoir passer à la version complète, alors ne me détestez pas. ;-))) Il doit y avoir quelque chose avec la communication avec la base de données qui cause le problème.
la source
Vérifiez ces étapes suivantes
2.
la source
Modifiez
Global.asax.cs
, y compris l'Application_Start
événement avec:la source
Cette erreur peut indiquer un problème avec votre chaîne de connexion et si votre nom de chaîne de connexion correspond à la déclaration de contexte de base de données.
J'ai eu cette erreur car j'avais mal nommé la base de données locale (erreur stupide) et le nom de la chaîne de connexion dans web.config de "DefaultConnection" ne correspondait pas au MyDbContext ie
la source
Essayez d'utiliser Database SetInitializer qui appartient à l'utilisation de System.Data.Entity;
Dans Global.asax
Cela créera une nouvelle base de données à chaque fois que votre modèle est modifié, mais votre base de données sera vide.Pour la remplir de données factices, vous pouvez utiliser Seeding. Que vous pouvez implémenter en tant que:
Ensemencement ::
la source
C'est bizarre, mais toutes les réponses ici étaient inutiles pour moi. Pour moi, j'ai travaillé l'initialiseur
MigrateDatabaseToLatestVersion
Voici ma solution (je sais, cela peut être beaucoup plus simple, mais c'est comme ça que je l'utilise):
MyDbInitializerForTesting hérite simplement de DropCreateDatabaseAlways donc dans certains cas spécifiques (tests), la base de données entière est reconstruite. Sinon, il est migré vers la dernière version.
Ma source: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific
la source
J'ai eu le même problème lorsque nous avons utilisé une base de données pour deux applications. La définition
disableDatabaseInitialization="true"
dans la section de type de contexte fonctionne pour moi.Voir plus de détails https://msdn.microsoft.com/en-us/data/jj556606.aspx
la source
Créez un initialiseur de contexte personnalisé:
Notez que Migrations.Configuration est une classe générée par la ligne de commande de migration dans la console du gestionnaire de packages. Vous devrez peut-être modifier le modificateur interne en public de la classe Migrations.Configuration.
Et enregistrez-le depuis votre OmModelCreating:
la source
Ici, je veux partager une autre méthode qui empêche l'erreur de sauvegarde du modèle lorsque le contexte est modifié:
1) Ouvrez votre fichier DbContext
2) Ajouter un espace de noms à l'aide de Microsoft.AspNet.Identity.EntityFramework;
3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }
la source