Das Modell, das den <Datenbank> -Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert

253

Die Fehlermeldung:

"Das Modell, das den 'AddressBook'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert. Löschen / aktualisieren Sie die Datenbank entweder manuell oder rufen Sie Database.SetInitializer mit einer IDatabaseInitializer-Instanz auf. Beispielsweise löscht die Strategie RecreateDatabaseIfModelChanges die Datenbank automatisch und erstellt sie neu optional mit neuen Daten versehen. "

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 Datenbankname lautet also "AddressBook" und der Fehler tritt auf, wenn ich versuche, das Kontaktobjekt zum Kontext hinzuzufügen. Vermisse ich hier etwas?

Ashish Gupta
quelle
Entfernen Sie __MigrationHistory Tabelle aus Ihrer Datenbank
Zahid Hasan

Antworten:

397

Jetzt ist es:

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

in Ihrer YourDbContext.cs-Datei.

Matt Frear
quelle
Ich habe meine Produktionsdatenbank manuell geändert und die Migration deaktiviert und es funktioniert. Danke
Mohsen Afshin
13
Ps, das geht in Global.asax Application_Start ()
BritishDeveloper
48
Besser als Global.asax ist es, dies in den Konstruktor Ihrer DbContext-Klasse einzufügen. Auf diese Weise funktioniert es für jede Site, die den Kontext verwendet, und nicht nur für die eine Site, die von der Global.asax-Datei gesteuert wird.
Corin
7
Wahrscheinlich am besten in den statischen Konstruktor der Kontextklasse
einfügen,
3
Es sollte in einem geschützten Override-Void platziert werden. OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); base.OnModelCreating (modelBuilder); }
Chris Voon
135

Hier sind einige Informationen aus dem Blog von Scott Gu, die von Jeff gepostet wurden, was tatsächlich stattfindet:

Für diejenigen, die diese Ausnahme sehen:

"Das Modell, das den 'Produktions'-Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert. Entweder die Datenbank manuell löschen / aktualisieren oder Database.SetInitializermit einer IDatabaseInitializerInstanz aufrufen ."

Folgendes ist los und was dagegen zu tun ist:

Wenn ein Modell zum ersten Mal erstellt wird, führen wir einen DatabaseInitializer aus, um beispielsweise die Datenbank zu erstellen, wenn sie nicht vorhanden ist, oder Startdaten hinzuzufügen. Der Standard-DatabaseInitializer versucht, das zur Verwendung des Modells erforderliche Datenbankschema mit einem Hash des Schemas zu vergleichen, das in einer EdmMetadata-Tabelle gespeichert ist, die mit einer Datenbank erstellt wurde (wenn Code First die Datenbank erstellt). Bestehende Datenbanken haben keine EdmMetadata-Tabelle und daher auch keinen Hash… und die heutige Implementierung wird ausgelöst, wenn diese Tabelle fehlt. Wir werden daran arbeiten, dieses Verhalten zu ändern, bevor wir die Fial-Version ausliefern, da dies die Standardeinstellung ist. Bis dahin benötigen vorhandene Datenbanken im Allgemeinen keinen Datenbankinitialisierer, sodass sie für Ihren Kontexttyp deaktiviert werden können, indem Sie Folgendes aufrufen:

Database.SetInitializer<YourDbContext>(null);

Jeff

Geil
quelle
9
Ich habe es heute versucht und bekomme nicht mehr "Das Modell hat sich geändert", sondern "Ungültiger Objektname 'dbo.Table'"
Stefan Bergfeldt
3
Jeff wollte, dass dies eine Problemumgehung ist, aber es ist mehr als zwei Jahre her und SetInitializer auf null ist immer noch erforderlich. richtig? Könnte jemand bitte erklären, wie dies in den Migrationsworkflow passt.
Kroiz
2
@jakejgordon: Ich auch mit dem EF6, aber wenn es in Global.asax ist, behebt es nur das Problem beim Ausführen der Website. Wenn Sie Unit-Tests haben, sind Sie OOL. Besser in den Konstruktor von YourDbContext einfügen. Das behebt es für jedes Projekt, einschließlich der Website und der Testprojekte.
Rap
1
IMO, diese Antwort sollte höher bewertet werden, da sie tatsächlich erklärt, warum wir diese Codezeile hinzufügen müssen. Danke dir.
Paul
1
@StefanBergfeldt, wenn Sie oder jemand die Invalid object name 'dbo.TableÜberprüfung Ihrer Verbindungszeichenfolge attachDbFilename und ersten Katalog erhalten
benscabbia
41

Für Entity Framework 5.0.0.0 - 6.1.3

Sie DO wollen in der Tat folgendes tun:

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

Ja, Matt Frear ist richtig. UPDATE -EDIT: Vorsichtsmaßnahme ist, dass ich anderen darin zustimme, anstatt diesen Code zu global.asax hinzuzufügen, das Ihrer DbContext-Klasse hinzugefügt wurde

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

Wie bereits erwähnt, eignet sich dies auch gut für die Durchführung von Unit-Tests.

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

Ich werde in naher Zukunft wiederkommen, um einen CORE-Ausschnitt bereitzustellen.

Tom Stickel
quelle
1
Danke dir! Program.cs funktioniert definitiv für Konsolen.
HockeyJ
Wenn Sie Ihre Datenbank jedoch zum ersten Mal initialisieren, wird keine Datenbank erstellt, wenn setinitializer bei der Methode onModelCreating auf null gesetzt wird. Irgendwelche Gedanken? Eventhoug ich benutze (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Rupesh Kumar Tiwari
Ich muss meinen Code finden, den ich verwenden würde, damit ich manchmal eine Zeile auskommentiere und austausche ... Ich erinnere mich nicht sofort an das Problem, ich muss nachsehen.
Tom Stickel
1
Die beste Lösung. Dadurch wird meine Lösung ausgeführt, und ich habe keine Ahnung, welche Auswirkungen dies hat. Festschreiben und bereitstellen.
Svend
32

Führen Sie einfach den folgenden Befehl sql in SQL Server Management Studio aus:

delete FROM [dbo].[__MigrationHistory]
Shafqat Ali
quelle
1
Du hast mein Leben gerettet! Danke dir.
Marek Dorda
31

Dieser Fix funktioniert nach CTP5 nicht mehr.

Du musst Database.SetInitializer<YourContext>(null);

Chrisortman
quelle
1
Wohin geht das? OnModelCreating hat nichts zugängliches namens DbDatabase
James Reategui
Irgendwo beim Start habe ich meine in Application_Start gesetzt.
Chrisortman
Database.SetInitializer scheint in der endgültigen Version von EF 4.3 einwandfrei zu funktionieren.
Richard Beier
Ich gehe davon aus, dass "Dieser Fix funktioniert nach CTP5 nicht mehr" bedeutet, dass die akzeptierte Antwort vom 30. August 2010 das ist, was er sagt.
Tom Stickel
19

Habe gerade die Antwort herausgefunden und dachte daran, hier zu aktualisieren. Ich muss nur Folgendes tun.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}
Ashish Gupta
quelle
12
Dies ist mit späteren Versionen von EF nicht mehr möglich und modelBuilder.Conventions.Remove<IncludeMetadataConvention>();hilft auch nicht weiter. DbDatabase.SetInitialzer (null); funktioniert.
JTew
@ TomStickel - ich stimme zu. Als Antwort markiert stackoverflow.com/a/6143116/255562 .
Ashish Gupta
16

Oder Sie können diese Zeile in Ihre Global.asax.cs-Datei unter Application_Start () einfügen:

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

Stellen Sie sicher, dass Sie ProjectName.Path.Context in Ihren Namespace und Kontext ändern. Wenn Sie zuerst Code verwenden, wird diese gelöscht und eine neue Datenbank erstellt, wenn Änderungen am Schema vorgenommen werden.

goodies4uall
quelle
Genau das, was ich brauchte, da ich nur Prototyping machte. Vielen Dank.
Lerner
8

Ich habe viele Tage damit verbracht, dieses Problem zu lösen, viele verschiedene Beiträge analysiert und viele Optionen ausprobiert und schließlich behoben. Diese 2 Projekte in meiner Lösung mit EF-Code erste Migrationen:

  • Konsolenanwendung "DataModel", die hauptsächlich als Assembly verwendet wird und alle meine Code First Entities, DbContext, Mirgations und das generische Repository enthält. Ich habe diesem Projekt eine separate leere lokale Datenbankdatei (im Ordner DataModel / App_Data) hinzugefügt, um Migrationen von der Package Manager-Konsole generieren zu können.
  • WebApi, das auf das DataModel-Projekt verweist und eine lokale Datenbankdatei aus dem Ordner WebApi / App_Data verwendet, die nicht im Projekt enthalten ist

Ich habe diesen Fehler erhalten, als ich WebApi angefordert habe ...

Meine Umgebung:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional mit Update 1
  • Alle meine Projekte für .NET Framework 4.6.1
  • EntityFramework 6.1.3 von NuGet

Hier habe ich alle Anmerkungen gesammelt, auf die Sie achten sollten, sowie alle Bedingungen / Anforderungen, die erfüllt sein müssen, um die genannten Ausnahmen zu vermeiden:

  1. Sie sollten für alle Projekte in Ihrer Lösung nur eine Version des EntityFramework Nuget-Pakets verwenden.
  2. Datenbank, die durch sequentielles Ausführen aller Migrationsskripte erstellt wurde, sollte dieselbe Struktur / dasselbe Schema wie Ihre Zieldatenbank haben und dem Entitätsmodell entsprechen. Die folgenden 3 Dinge müssen genau übereinstimmen / reflektieren / übereinstimmen:
    • Ihr gesamtes Migrationsskript ist auf dem neuesten Stand
    • Aktueller Status des ersten Code-Entitätsmodells (DbContext, Entitäten)
    • Zieldatenbank
  3. Die Zieldatenbank (MDF-Datei) sollte aktualisiert werden / dem letzten Migrationsskript entsprechen. Stellen Sie sicher, dass die Tabelle "__MigrationHistory" in Ihrer Zieldatenbank Datensätze für alle vorhandenen Migrationsskripte enthält. Dies bedeutet, dass alle Migrationsskripte erfolgreich auf diese Datenbank angewendet wurden. Ich empfehle Ihnen, Visual Studio zu verwenden, um korrekte Code-First-Entitäten und -Kontexte zu generieren, die Ihrer Datenbank entsprechen. Projekt -> Neues Element hinzufügen -> ADO.NET-Entitätsdatenmodell -> Code First aus der Datenbank: Natürlich als Alternative, wenn Sie haben keine Datenbank, die Sie manuell schreiben können (Code zuerst Entitäten und Kontext) und dann die erste Migration und Datenbank generieren können.
  4. Name der Verbindungszeichenfolge, z. B. MyConnectionString in der Konfigurationsdatei des Startprojekts (Web.config / App.config):

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

    sollte gleich dem Parameter sein, der im Konstruktor Ihres DbContext übergeben wurde:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Stellen Sie vor der Verwendung der Package Manager-Konsole sicher, dass Sie die richtige Datenbank zum Aktualisieren oder Generieren der Migration verwenden und das erforderliche Projekt als Startprojekt der Lösung festgelegt ist. Für die Verbindung zur Datenbank wird die Verbindungszeichenfolge aus dieser .config-Datei verwendet, die im Projekt als Startprojekt festgelegt ist.
  6. Und das Hauptproblem, das mein Problem behoben hat: Es ist seltsam, aber in meinem WebApi / bin-Ordner war DataModel.exe alt und wurde seit dem letzten Build nicht aktualisiert. Da Migrationen in meine Assembly DataModel.exe eingebettet waren, aktualisierte meine WebApi-Datenbank alte Mirgationen. Ich war verwirrt, warum die Datenbank nach dem Aktualisieren in WebApi nicht dem neuesten Migrationsskript von DataModel entspricht. Der folgende Code erstellt automatisch (falls nicht vorhanden) oder aktualisiert die neueste lokale Migrationsdatenbank in meinem WebApi / App_Data-Ordner.

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

    Ich habe versucht, die Lösung zu bereinigen und neu zu erstellen, aber es hat nicht geholfen, als ich die Ordner bin und obj vollständig aus WebApi entfernt, Datenbankdateien aus WebApi / App_Data gelöscht, WebApi erstellt, neu gestartet, eine Anfrage gestellt und eine korrekte Datenbank erstellt habe - verzögerte Initialisierung (mit Zeilen oben), die der letzten Migration entsprechen, und Ausnahme wurde nicht mehr angezeigt. Dies kann also Ihr Problem beheben:

    1. Entfernen Sie manuell die Ordner bin, obj aus Ihrem Startprojekt (das Ihre Datenbank generiert / aktualisiert).
    2. Erstellen Sie Ihr Startprojekt oder bereinigen Sie Ihre gesamte Lösung und erstellen Sie sie neu.
    3. Erstellen Sie die Datenbank neu, indem Sie das Projekt starten (führt die obigen Zeilen aus), oder verwenden Sie den Befehl "update-database" der Package Manager Console.
    4. Überprüfen Sie manuell, ob die generierte Datenbank und __MirgationHistory dem neuesten Migrationsskript entsprechen.
Sergey Kulgan
quelle
5

Für mich schneide ich mit dem Upgrade auf 4.3.1 einfach die EdmMetaData-Tabelle ab oder lösche sie einfach sofort.

Robert Koch
quelle
Ich habe auf 4.3.1 aktualisiert und dann die EdmMaetaData-Tabelle umbenannt. Ich kann jetzt nach Bedarf Änderungen am Modell vornehmen und keine störenden Fehlermeldungen mehr über das Modell, das bla bla unterstützt.
Ashok Padmanabhan
3

Für VB.NET-Entwickler:

Fügen Sie der Datei Glabal.asax.vb am Ende der Methode Application_Start () die folgende Zeile hinzu.

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Ändern Sie ApplicationDbContext in Ihren spezifischen Datenbankkontext.

Eric Schneider
quelle
2

Ich hatte dieses Problem und es stellte sich heraus, dass ein Projekt auf SQLExpress zeigte, das mit dem Problem jedoch auf LocalDb. (in ihrer jeweiligen web.config). Dummes Versehen, aber erwähnenswert, falls jemand anderes dieses Problem behebt.

stuartdotnet
quelle
2

Dies bedeutet, dass einige Änderungen am Kontext vorgenommen wurden, die nicht ausgeführt wurden. Führen Sie zuerst Add-Migration aus, um die vorgenommenen Änderungen zu generieren (die Änderungen, die uns möglicherweise nicht bekannt sind), und führen Sie dann Update-Database aus

Kerisnarendra
quelle
2

Ich hatte das gleiche Problem - das erneute Hinzufügen der Migration und das Aktualisieren der Datenbank funktionierten nicht und keine der obigen Antworten schien richtig zu sein. Dann traf mich die Inspiration - ich verwende mehrere Ebenen (ein Web, ein Daten- und ein Unternehmen). Die Datenschicht hat den Kontext und alle Modelle. Die Webschicht hat diese Ausnahme nie ausgelöst - es war die Geschäftsschicht (die ich als Konsolenanwendung zum Testen und Debuggen festgelegt habe). Es stellte sich heraus, dass die Business-Schicht nicht die richtige Verbindungszeichenfolge verwendete, um die Datenbank abzurufen und den Kontext zu erstellen. Also habe ich die Verbindungszeichenfolge zur App-Konfiguration der Business-Schicht (und der Datenschicht) hinzugefügt und Viola funktioniert. Stellen Sie dies hier für andere ein, die möglicherweise auf dasselbe Problem stoßen.

Richard Barker
quelle
1

Ich verwende die Database.CompatibleWithModel-Methode (verfügbar in EF5), um zu testen, ob das Modell und die Datenbank übereinstimmen, bevor ich sie verwende. Ich rufe diese Methode direkt nach dem Erstellen des Kontexts auf ...

        // 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
quelle
1

Guter Vorschlag, jedoch nicht in allen Fällen so genau. Ich finde einen heraus. Bitte stellen Sie sicher, dass Sie "enable-migrations" unter Verwendung von PM-Fenstern in Visual Studio ausführen und der Migrationsordner zu Ihrem Projekt hinzugefügt wird.

Stellen Sie sicher, dass die beiden c # -Klassendateien, die dem Ordner hinzugefügt wurden, alle Ihre Modelle und ihre jeweiligen Eigenschaften enthalten.

Wenn Sie alle haben, die die Lösung erstellen, und veröffentlichen Sie sie für die Bereitstellung.

Die Logik ist, dass die vorhandenen Metadaten nicht überschrieben werden können, da Ihre Anwendung keine Metadaten hat, die die aktuellen ersetzen könnten. Als Ergebnis wird folgende Fehlermeldung angezeigt: "Das Modell, das den Kontext unterstützt, hat sich seit der Erstellung der Datenbank geändert."

Kay Ken
quelle
1

Nur für den Fall, dass jemand das gleiche Szenario wie ich hat.

Ich habe zuerst die Datenbank EF und benutze gleichzeitig die asp.net-Identität

Ich habe also zwei connectionStrings in meiner Webkonfiguration, und damit gibt es kein Problem. Es ist passiert, dass ich die Skripte erstellt / ausgeführt habe, um manuell die asp.net-Identitätstabellen zu generieren, die ich nicht sollte.

DROP also zuerst alle von Ihnen manuell / aus Skripten erstellten asp.net-Identitätstabellen.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers
Francis Saul
quelle
1

Keine dieser Lösungen würde für uns funktionieren (außer das Deaktivieren der Schemaüberprüfung insgesamt). Am Ende hatten wir ein Miss-Match in unserer Version von Newtonsoft.json

Unsere AppConfig wurde nicht korrekt aktualisiert:

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

Die Lösung bestand darin, die Assembly-Version auf die Version zu korrigieren, die wir tatsächlich bereitgestellt haben

<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
quelle
Wir hatten ein ähnliches Problem mit der Version von Newtonsoft.json. Als wir die Version aktualisierten, wurde das Problem behoben.
Rui Estreito
0

Nach einigen Recherchen zu diesem Thema stellte ich fest, dass der Fehler im Grunde genommen auftritt, wenn Sie eine Instanz von db zuvor auf Ihrem lokalen SQL Server Express erstellt haben. Wenn Sie also Updates für db haben und versuchen, die Datenbank zu aktualisieren / Code auf db ausführen, ohne den Update DatabaseBefehl using auszuführen Package Manager Console; Zunächst müssen Sie die vorherige Datenbank in unserem lokalen SQL Express manuell löschen.

Diese Lösung funktioniert auch, es sei denn, Sie haben AutomaticMigrationsEnabled = false;in Ihrer Konfiguration.

Wenn Sie mit einem Versionskontrollsystem (git, svn usw.) Arbeiten und einige andere Entwickler DB-Objekte in der Produktionsphase aktualisieren, tritt dieser Fehler immer dann auf, wenn Sie Ihre Codebasis aktualisieren und die Anwendung ausführen.

Wie oben erwähnt, gibt es hierfür einige Lösungen auf Codebasis. Dies ist jedoch in einigen Fällen die praktischste.

Mahmut C.
quelle
0

Ich lese auch das Pro ASP.NET MVC 4-Buch und bin auf dasselbe Problem gestoßen, das Sie hatten. Bei mir trat das Problem auf, nachdem ich die im Abschnitt "Hinzufügen von Modellvalidierung" des Buches vorgeschriebenen Änderungen vorgenommen hatte. Ich habe das Problem gelöst, indem ich meine Datenbank von localdb auf den vollständigen SQL Server 2012-Server verschoben habe. (Übrigens, ich weiß, dass ich das Glück habe, auf die vollständige Version umsteigen zu können, also hasse mich nicht. ;-))) Die Kommunikation mit der Datenbank muss etwas enthalten, das das Problem verursacht.

J3Speaks
quelle
Woher wissen Sie, dass es sich um die Kommunikation mit der Datenbank handelt und nicht beispielsweise um deren Metadaten?
Flup
2
Entschuldigung für die späte Antwort. Es stellt sich heraus, dass es überhaupt kein Kommunikationsproblem ist! Das Wiederherstellen der Datenbank hat das Problem nur maskiert, da ich wieder das gleiche Problem habe! Ein __Migrationxxx (ich kann mich nicht an den genauen Namen der Tabelle erinnern, weil ich ihn gerade entfernt habe) wird von ef erstellt. Löschen Sie es einfach und Sie sollten alle gut sein.
J3Speaks
@ MyJ3 Alle Leute, die all diese verdammten Zeilen und Codezeilen ausstoßen. Das alles was ich brauchte! Verdient eine Antwort (optionales Szenario).
Terrance00
@ Terrance00 Danke!
J3Speaks
0

Überprüfen Sie die folgenden Schritte

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

2.

  1. Ihr Kontextklassenname sollte mit check it übereinstimmen
Siva
quelle
0

Ändern Global.asax.cs, einschließlich des Application_StartEreignisses mit:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
oeddy
quelle
5
Ich würde ein bisschen klarer darüber sein, was dies persönlich tut.
Casey
3
NEIN NEIN NEIN, ich möchte DropCreateDatabaseIfModelChanges nicht 99% der Zeit verwenden!
Tom Stickel
0

Dieser Fehler kann auf ein Problem mit Ihrer Verbindungszeichenfolge hinweisen und darauf, ob der Name Ihrer Verbindungszeichenfolge mit der Datenbankkontextdeklaration übereinstimmt.

Ich hatte diesen Fehler, weil ich die lokale Datenbank falsch benannt hatte (dummer Fehler) und der Name der Verbindungszeichenfolge in web.config von "DefaultConnection" nicht mit MyDbContext übereinstimmte, d. H.

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


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

Versuchen Sie es mit Database SetInitializer, der zur Verwendung von System.Data.Entity gehört.

In Global.asax

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

Dadurch wird jedes Mal eine neue Datenbank erstellt, wenn Ihr Modell geändert wird. Ihre Datenbank wäre jedoch leer. Um sie mit Dummy-Daten zu füllen, können Sie Seeding verwenden. Was Sie implementieren können als:

Seeding ::

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
quelle
0

Es ist komisch, aber alle Antworten hier waren für mich nutzlos. Für mich arbeitete Initialisierer

MigrateDatabaseToLatestVersion

Hier ist meine Lösung (ich weiß, es kann viel einfacher sein, aber so benutze ich es):

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 erbt nur von DropCreateDatabaseAlways, sodass in einem bestimmten Fall (Test) die gesamte Datenbank neu erstellt wird. Andernfalls wird es auf die neueste Version migriert.

Meine Quelle: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific

Tomino
quelle
0

Ich hatte das gleiche Problem, als wir eine Datenbank für zwei Anwendungen verwendeten. Das Einstellen disableDatabaseInitialization="true"im Abschnitt Kontexttyp funktioniert bei mir.

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

Weitere Informationen finden Sie unter https://msdn.microsoft.com/en-us/data/jj556606.aspx

Julia Savinkova
quelle
0

Erstellen Sie einen benutzerdefinierten Kontextinitialisierer:

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

Beachten Sie, dass Migrations.Configuration eine Klasse ist, die über die Migrationsbefehlszeile in der Package Manager-Konsole generiert wird. Möglicherweise müssen Sie den internen in den öffentlichen Modifikator der Migrations.Configuration-Klasse ändern.

Und registrieren Sie es von Ihrem OmModelCreating:

public partial class MyDbContext : DbContext
{

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

        //other code for creating model
    }
}
Tomas Kubes
quelle
-1

Hier möchte ich eine andere Methode vorstellen, die den Fehler der Modellunterstützung verhindert, wenn sich der Kontext ändert:

1) Öffnen Sie Ihre DbContext-Datei

2) Fügen Sie einen Namespace mit Microsoft.AspNet.Identity.EntityFramework hinzu.

3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }}

Milan Goswami
quelle