Le modèle soutenant le contexte <Database> a changé depuis la création de la base de données

253

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?

Ashish Gupta
la source
Supprimer la table __MigrationHistory de votre base de données
Zahid Hasan

Réponses:

397

Maintenant c'est:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

dans votre fichier YourDbContext.cs.

Matt Frear
la source
J'ai changé ma base de données de production manuellement et désactivé la migration et cela fonctionne, merci
Mohsen Afshin
13
Ps, cela va dans Global.asax Application_Start ()
BritishDeveloper
48
Mieux que Global.asax est de mettre cela dans le constructeur de votre classe DbContext. De cette façon, cela fonctionne pour chaque site utilisant le contexte plutôt que pour le seul site contrôlé par le fichier Global.asax.
Corin
7
Il est probablement préférable de le mettre dans le constructeur statique de la classe de contexte afin qu'il ne soit appelé qu'une seule fois - comme dans cet exemple de vidéo: msdn.microsoft.com/en-us/data/jj572367
Christian Fredh
3
Il doit être placé dans le remplacement protégé void OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); base.OnModelCreating (modelBuilder); }
Chris Voon
135

Voici quelques informations du blog de Scott Gu publiées par Jeff sur ce qui se passe réellement:

Pour ceux qui voient cette exception:

"Le modèle qui soutient le contexte" Production "a changé depuis la création de la base de données. Supprimez / mettez à jour manuellement la base de données ou appelez Database.SetInitializeravec une IDatabaseInitializerinstance."

Voici ce qui se passe et ce qu'il faut faire à ce sujet:

Lorsqu'un modèle est créé pour la première fois, nous exécutons un DatabaseInitializer pour faire des choses comme créer la base de données s'il n'y est pas ou ajouter des données de départ. Le DatabaseInitializer par défaut essaie de comparer le schéma de base de données nécessaire pour utiliser le modèle avec un hachage du schéma stocké dans une table EdmMetadata créée avec une base de données (lorsque Code First est celui qui crée la base de données). Les bases de données existantes n'auront pas la table EdmMetadata et n'auront donc pas le hachage… et l'implémentation d'aujourd'hui lancera si cette table est manquante. Nous travaillerons sur la modification de ce comportement avant d'expédier la version finale car c'est la valeur par défaut. Jusque-là, les bases de données existantes n'ont généralement pas besoin d'un initialiseur de base de données, il peut donc être désactivé pour votre type de contexte en appelant:

Database.SetInitializer<YourDbContext>(null);

Jeff

Excité
la source
9
J'ai essayé cela aujourd'hui, et je n'ai plus "Le modèle a changé", je reçois à la place "Nom d'objet invalide 'dbo.Table'"
Stefan Bergfeldt
3
Jeff voulait que ce soit une solution de contournement, mais cela fait plus de deux ans et SetInitializer à null est toujours requis. droite? Quelqu'un pourrait-il donc expliquer comment cela s'intègre au flux de travail de migration.
kroiz
2
@jakejgordon: Moi aussi avec l'EF6 mais s'il est dans Global.asax, cela ne résout le problème que lors de l'exécution du site Web. Si vous avez des tests unitaires, vous êtes OOL. Mieux vaut le mettre dans le constructeur de YourDbContext. Cela le corrige pour chaque projet, y compris le site Web et les projets de test.
Rap
1
OMI, cette réponse devrait être mieux notée car elle explique en fait pourquoi nous devons ajouter cette ligne de code. Je vous remercie.
Paul
1
@StefanBergfeldt si vous ou quelqu'un obtenez la Invalid object name 'dbo.Tablevérification de votre chaîne de connexion attachDbFilename et catalogue initial
benscabbia
41

Pour Entity Framework 5.0.0.0 - 6.1.3

Vous N'ÊTES voulez bien faire ce qui suit:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

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.

Tom Stickel
la source
1
Je vous remercie! Program.cs fonctionne certainement pour les consoles.
HockeyJ
Mais lorsque vous initialisez votre base de données pour la première fois, il ne crée pas de base de données si je mets setinitializer null à la méthode onModelCreating. Des pensées ? Eventhoug que j'utilise (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Rupesh Kumar Tiwari
J'ai besoin de trouver mon code que j'utiliserais que je commenterais parfois une ligne et échanger ... Je ne me souviens pas du problème, j'ai besoin de regarder.
Tom Stickel
1
La meilleure solution. Cela provoque l'exécution de ma solution et je n'ai aucune idée des ramifications. Validez et déployez.
Svend
32

Exécutez simplement la commande sqowng sqowng dans SQL Server Management Studio:

delete FROM [dbo].[__MigrationHistory]
Shafqat Ali
la source
1
Tu m'as sauvé la vie! Je vous remercie.
Marek Dorda
31

Ce correctif ne fonctionne plus après CTP5.

Tu dois faire Database.SetInitializer<YourContext>(null);

chrisortman
la source
1
Où cela va-t-il ... OnModelCreating n'a rien accessible appelé DbDatabase
James Reategui
Quelque part au démarrage, j'ai mis le mien dans Application_Start.
chrisortman
Database.SetInitializer semble fonctionner correctement dans la version finale d'EF 4.3.
Richard Beier
Je suppose que «ce correctif ne fonctionne plus après CTP5» signifie que la réponse acceptée du 30 août 2010 est ce qu'il dit.
Tom Stickel
19

Je viens de découvrir la réponse et j'ai pensé à mettre à jour ici. Il suffit de faire ce qui suit.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}
Ashish Gupta
la source
12
Ce n'est plus possible avec les versions ultérieures d'EF, cela modelBuilder.Conventions.Remove<IncludeMetadataConvention>();n'aide pas non plus la situation. DbDatabase.SetInitialzer (null); fonctionne.
JTew
@TomStickel - Je suis d'accord. Markover stackoverflow.com/a/6143116/255562 comme réponse.
Ashish Gupta
16

Ou vous pouvez mettre cette ligne dans votre fichier Global.asax.cs sous Application_Start ():

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

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.

goodies4uall
la source
Exactement ce dont j'avais besoin, car je ne faisais que du prototypage. Merci beaucoup.
Apprenti
8

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:

  • Application console "DataModel" qui utilise principalement comme assemblage qui contient toutes mes premières entités de code, DbContext, Mirgations et référentiel générique. J'ai inclus dans ce projet un fichier de base de données local vide distinct (dans le dossier DataModel / App_Data) pour pouvoir générer des migrations à partir de la console du gestionnaire de package.
  • WebApi, qui fait référence au projet DataModel et utilise le fichier de base de données local du dossier WebApi / App_Data, qui n'est pas inclus dans le projet

J'ai eu cette erreur lorsque demandé WebApi ...

Mon environnement:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional avec Update 1
  • tous mes projets ciblés pour .NET Framework 4.6.1
  • EntityFramework 6.1.3 de NuGet

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:

  1. Vous ne devez utiliser qu'une seule version du package EntityFramework Nuget pour tous les projets de votre solution.
  2. La base de données, créée en exécutant séquentiellement tous les scripts de migration doit avoir la même structure / schéma que la base de données cible et correspondre au modèle d'entité. Les 3 éléments suivants doivent correspondre / refléter / correspondre exactement:
    • Votre script de migration complet jusqu'à la fin
    • État actuel du modèle de première entité du code (DbContext, entités)
    • Base de données cible
  3. La base de données cible (fichier mdf) doit être mise à jour / correspondre jusqu'au dernier script de migration. Vérifiez que la table "__MigrationHistory" dans votre base de données cible contient des enregistrements pour tous les scripts de migration que vous possédez, cela signifie que tous les scripts de migration ont été correctement appliqués à cette base de données. Je vous recommande d'utiliser Visual Studio pour générer les premières entités de code correctes et le contexte qui correspond à votre base de données, Projet -> Ajouter un nouvel élément -> ADO.NET Entity Data Model -> Code First à partir de la base de données: Bien sûr, comme alternative, si vous n'avez pas de base de données, vous pouvez écrire manuellement un modèle (coder d'abord les entités et le contexte), puis générer la migration initiale et la base de données.
  4. Nom de la chaîne de connexion, par exemple MyConnectionString dans le fichier de configuration du projet de démarrage (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>

    doit être égal au paramètre passé dans le constructeur de votre DbContext:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Avant d'utiliser la console du gestionnaire de packages , assurez-vous que vous utilisez la base de données appropriée pour la mise à jour ou générez la migration et que le projet nécessaire est défini comme projet de démarrage de la solution. Pour se connecter à la base de données, il utilisera la chaîne de connexion de ce fichier .config, qui dans le projet, est défini comme projet de démarrage.
  6. 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.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...

    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:

    1. supprimer manuellement les dossiers bin, obj de votre projet de démarrage (qui génère / met à jour votre base de données)
    2. construire votre projet de démarrage ou mieux nettoyer et reconstruire toute votre solution.
    3. recréez la base de données en démarrant le projet (exécutera les lignes ci-dessus) ou utilisez la commande "update-database" de la console du gestionnaire de packages.
    4. vérifier manuellement si la base de données générée et __MirgationHistory correspondent au dernier script de migration.
Sergey Kulgan
la source
5

Pour moi, avec la mise à niveau vers 4.3.1, je viens de tronquer la table EdmMetaData ou de la supprimer purement et simplement.

Robert Koch
la source
J'ai mis à jour vers 4.3.1, puis j'ai renommé la table EdmMaetaData. Je peux maintenant apporter des modifications au modèle selon les besoins et plus de messages d'erreur gênants sur le support du modèle bla bla.
Ashok Padmanabhan
3

Pour les développeurs VB.NET:

Ajoutez la ligne suivante au fichier Glabal.asax.vb, à la fin de la méthode Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Remplacez ApplicationDbContext par votre contexte Db spécifique.

Eric Schneider
la source
2

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.

stuartdotnet
la source
2

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

Kerisnarendra
la source
2

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.

Richard Barker
la source
1

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 ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }
flobadob
la source
1

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"

Kay Ken
la source
1

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.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers
Francis Saul
la source
1

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:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

La solution était de corriger la version d'assemblage à celle que nous déployions réellement

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>
AcidPAT
la source
Nous avons eu un problème similaire avec la version de Newtonsoft.json, lorsque nous avons mis à jour la version, le problème a été résolu.
Rui Estreito
0

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 Databasecommande using Package 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.

Mahmut C
la source
0

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.

J3Speaks
la source
Comment savez-vous que c'est la communication avec la base de données, et non par exemple ses métadonnées?
flup
2
Désolé pour la réponse tardive. Il s'avère que ce n'est pas du tout un problème de communication! La recréation de la base de données a simplement masqué le problème, car j'ai à nouveau rencontré le même problème! Un __Migrationxxx (ne me souviens pas du nom exact de la table car je viens de le supprimer) est créé par ef. Supprimez-le simplement et tout devrait bien se passer.
J3Speaks du
@ MyJ3 Toutes les personnes jaillissant de toutes ces lignes friggin et lignes de code. C'est tout ce dont j'avais besoin! Mérite d'être une réponse (scénario facultatif).
Terrance00
@ Terrance00 Merci!
J3Speaks
0

Vérifiez ces étapes suivantes

  1. Database.SetInitializer (null); -> dans Global.asax.cs

2.

  1. votre nom de classe de contexte doit correspondre avec le vérifier
Siva
la source
0

Modifiez Global.asax.cs, y compris l' Application_Startévénement avec:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
oeddy
la source
5
Je serais un peu plus clair sur ce que cela fait, personnellement.
Casey
3
NON NON NON, je ne veux pas utiliser DropCreateDatabaseIfModelChanges 99% du temps!
Tom Stickel
0

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

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>
DanAbdn
la source
0

Essayez d'utiliser Database SetInitializer qui appartient à l'utilisation de System.Data.Entity;

Dans Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

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 ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}
SinghMavi
la source
0

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):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

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

Tomino
la source
0

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.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Voir plus de détails https://msdn.microsoft.com/en-us/data/jj556606.aspx

Julia Savinkova
la source
0

Créez un initialiseur de contexte personnalisé:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

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:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}
Tomas Kubes
la source
-1

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 ()); }

Milan Goswami
la source