261 votes

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

Le message d'erreur :

"Le modèle de la sauvegarde de l' 'Carnet d'adresses' 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 instance. Par exemple, le RecreateDatabaseIfModelChanges stratégie sera automatiquement supprimer et recréer la base de données, et éventuellement de graines avec de nouvelles données."

Je suis en train d'utiliser le code-première fonction 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());

            }

Le contexte de la classe:

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 base de données est "Carnet d'adresses" et l'erreur qui se passe lorsque j'essaie d'ajouter le contact de l'objet au contexte. Ai-je raté quelque chose ici?

414voto

Matt Frear Points 6287

Maintenant c'est:

 Database.SetInitializer<YourDbContext>(null);
 

138voto

Randy Points 921

Voici quelques informations de Scott Gu Blog posté par Jeff sur ce qui est fait:

Pour ceux qui voient cette exception:

"Le modèle de la sauvegarde de la "Production" contexte a changé depuis la la base de données a été créé. Soit manuellement supprimer/mettre à jour la base de données, ou appelez Database.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 à 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écessaire 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 aujourd'hui, vont se 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 initialiseur de sorte qu'il peut être désactivé pour votre type de contexte en appelant:

Database.SetInitializer<YourDbContext>(null);

Jeff

41voto

Tom Stickel Points 4201

Pour Entity Framework 5.0.0.0

Vous voulez en effet 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.

31voto

chrisortman Points 782

Ce correctif ne fonctionne plus après CTP5.

Vous devez faire DbDatabase.SetInitializer<YourContext>(null);

18voto

Ashish Gupta Points 5229

Juste trouvé la réponse et la pensée de mise à jour ici. Juste besoin de faire ce qui suit.

 public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}
 

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:

X