265 Stimmen

Das Modell, das dem <Database>-Kontext zugrunde liegt, hat sich seit der Erstellung der Datenbank geändert

Die Fehlermeldung :

"Das Modell, das dem Kontext 'AddressBook' zugrunde liegt, hat sich seit der Erstellung der Datenbank geändert. Entweder löschen/aktualisieren Sie die Datenbank manuell, oder rufen Sie Database.SetInitializer mit einer IDatabaseInitializer-Instanz auf. Die Strategie RecreateDatabaseIfModelChanges zum Beispiel löscht und erstellt die Datenbank automatisch neu und versorgt sie optional mit neuen Daten."

Ich versuche, die Code-First-Funktion zu verwenden, und habe Folgendes geschrieben:

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

Die Kontextklasse:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

und die Verbindungszeichenfolge:

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

Der Name der Datenbank lautet also "AddressBook", und der Fehler tritt auf, wenn ich versuche, das Kontaktobjekt zum Kontext hinzuzufügen. Habe ich hier etwas übersehen?

420voto

Matt Frear Punkte 48503

Jetzt ist es so:

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

in Ihrer Datei YourDbContext.cs.

140voto

Randy Punkte 1915

Hier sind einige Informationen von Scott Gu's Blog aufgestellt von Jeff über das, was tatsächlich geschieht:

Für diejenigen, die diese Ausnahme sehen:

"Das Modell, das den Kontext 'Produktion' unterstützt, hat sich seit der Erstellung der Datenbank erstellt wurde. Entweder löschen/aktualisieren Sie die Datenbank manuell, oder rufen Sie auf. Database.SetInitializer mit einer IDatabaseInitializer Instanz".

Hier erfahren Sie, was los ist und was Sie dagegen tun können:

Wenn ein Modell zum ersten Mal erstellt wird, führen wir einen DatabaseInitializer aus, um die Datenbank zu erstellen, wenn sie noch nicht vorhanden ist, oder Seed-Daten hinzuzufügen. Der Standard DatabaseInitializer versucht, das Datenbankschema zu vergleichen das für die Verwendung des Modells benötigt wird, mit einem Hash des Schemas zu vergleichen, das in einer EdmMetadata-Tabelle, die mit einer Datenbank erstellt wird (wenn Code First derjenige ist, der die Datenbank erstellt). Vorhandene Datenbanken verfügen nicht über die EdmMetadata-Tabelle und somit auch den Hash nicht und die Implementierung wird heute einen Fehler auslösen, wenn diese Tabelle fehlt. Wir werden daran arbeiten, dieses Verhalten zu ändern Verhalten zu ändern, bevor wir die endgültige Version ausliefern, da es der Standard ist. Bis dahin brauchen existierende Datenbanken im Allgemeinen keinen Datenbank Initialisierer, so dass er für Ihren Kontexttyp durch Aufruf ausgeschaltet werden kann:

Database.SetInitializer<YourDbContext>(null);

Jeff

44voto

Tom Stickel Punkte 18167

Für Entity Framework 5.0.0.0 - 6.1.3

Sie DO in der Tat das Folgende tun wollen:

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

Ja, Matt Frear hat Recht. UPDATE -EDIT: Caveat ist, dass ich mit anderen in, dass statt Hinzufügen dieser Code zu global.asax hinzugefügt, um Ihre DbContext-Klasse zustimmen

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

Wie bereits von anderen erwähnt, ist dies auch gut für die Handhabung der Unit-Tests.

Derzeit verwende ich dies mit Entity Framework 6.1.3 /.net 4.6.1

Ich werde in naher Zukunft wieder einen CORE-Schnipsel zur Verfügung stellen.

36voto

Shafqat Punkte 1086

Führen Sie einfach den folgenden SQL-Befehl im SQL Server Management Studio aus:

delete FROM [dbo].[__MigrationHistory]

31voto

chrisortman Punkte 1504

Diese Lösung funktioniert nach CTP5 nicht mehr.

Sie müssen Folgendes tun Database.SetInitializer<YourContext>(null);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X