Wie kann ich Code First Migrations deaktivieren?

84

Ich habe ein Code-First-Entity-Modell in EF5. Ich möchte die Datenbankänderungen jedoch manuell verwalten. Ich möchte nicht, dass EF meine vorhandene Datenbank und alle ihre Daten ändert. Wenn ich jedoch parallele Änderungen in der EF-Zuordnung und in der Datenbank vornehme, weigert sich EF, ordnungsgemäß zu funktionieren, und teilt mir mit, dass ich zuerst die Code-Migration verwenden muss. Wie schalte ich das aus?

Stan Hargrove
quelle
Mögliches Duplikat von Wie kann ich die Migration in Entity Framework 6.0 deaktivieren?
Michael Freidgeim

Antworten:

99

Setzen Sie den Database.SetInitializer auf null.

public class DatabaseContext: DbContext
{
    //the base accepts the name of the connection string provided in the web.config as a parameter
    public DatabaseContext()
        : base("DatabaseContext")
    {
        //disable initializer
        Database.SetInitializer<DatabaseContext>(null);
    }
Sarath Rachuri
quelle
2
Das Festlegen des Initialisierers im Instanzkonstruktor des Kontexts ist nicht sinnvoll. EF ruft den Initialisierer auf, bevor Sie tatsächlich zu diesem Code gelangen, wenn Sie versuchen, einen neuen Kontext zu erstellen.
Jcl
1
Überprüfen Sie die Antwort einfach anhand von "Diagnostic Tool" in VS 2017. Die ADO.NET-Aufrufe vor der ersten gewünschten SQL-Abfrage wurden gestoppt, nachdem der Intializer im Konstruktor auf null gesetzt wurde.
Karl
2
Es funktioniert wie erwartet. Es ist wahr, dass EF den Initialisierer vorher aufruft, aber wenn Sie ihn dann im Konstruktor erneut aufrufen, ignoriert der DbContext die Migrationen einfach, falls Sie die Tatsache ignorieren möchten, dass Sie __MigrationHistorynicht über die neueste Migration verfügen und dies nicht möchten mach es trotzdem. In meinem Fall verwende ich Migrationen in einer Entwicklungsumgebung, aber wenn ich sie für die Produktion bereitstelle, verwende ich SSDT, um die Datenbank zu aktualisieren. Daher würde EF sich beschweren, dass sich das Modell geändert hat, weil __MigrationHistoryes nicht die neueste Migration hätte, aber ich kann garantieren, dass die Datenbank aktualisiert wird.
Alisson
Ich würde vorschlagen, den Aufruf Database.SetInitializervom Konstruktor zum Klassenkonstruktor zu verschieben. Dadurch wird sichergestellt, dass der Anruf nur einmal getätigt wird.
Steven
39

Die vollständigste Antwort, die ich gefunden habe, lautet:

  1. Löschen Sie den MigrationsOrdner in Ihrem Projekt.
  2. Legen Sie Database.SetInitializer<DatabaseContext>(null);in Ihrem DatabaseContext-Initialisierer fest.
  3. Löschen Sie die Tabelle __MigrationHistoryin Ihrer Datenbank. Bei EF6 + befindet sich die Tabelle unter Tables, bei früheren Versionen jedoch unter System Tables.
  4. Bauen und ausführen.
  5. Profitieren.
Karlingen
quelle
Leider prüft EF6 nach diesen Schritten immer noch, ob bei __MigrationHistoryjedem Start meiner Anwendung vorhanden ist, was die Startzeit meiner App um einige Millisekunden verlängert. Gibt es eine Möglichkeit, die __MigrationHistoryPrüfung vollständig zu deaktivieren ?
Dai
27

Wenn Sie Migrationen vollständig deaktivieren möchten:

https://stackoverflow.com/a/9709407/141172

Ich fand es jedoch besser, die ersten Code-Migrationen aktiviert zu lassen, aber die -ScriptOption zu verwenden, damit EF ein DB-Änderungsskript für mich erstellt, das ich manuell auf jede Datenbank (Entwicklung, Qualitätssicherung, Produktion) anwenden kann:

Update-Database -Script -ProjectName MyProject -StartupProjectName MyProject

Auf diese Weise erstellt EF das Änderungsskript für mich und ich habe weiterhin die volle Kontrolle über die angewendeten Änderungen. Ich versioniere die Änderungsskripte wie jeden anderen Quellcode.

Eric J.
quelle
1
Ihr Link entspricht nicht wirklich completely turn off migrations. Um dies zu tun: Database.SetInitializer<YourContextType>(null)Zum Start Ihrer Anwendung hinzufügen
Don Cheadle
Irgendeine Idee, wie dies mit EF Core erreicht werden kann?
Shimmy Weitzhandler
@Shimmy: EF Core sollte niemals automatisch versuchen, Ihre Datenbank zu ändern. Siehe github.com/dotnet/efcore/issues/3152
Eric J.
26

Wenn Sie bereits Migrationen verwendet haben, hilft es nicht, nur den Initializer zu ändern. Sie müssen zu Management Studio gehen, Ihre Datenbanktabellen öffnen, zum System TablesOrdner gehen und die dort befindliche __MigrationHistoryTabelle entfernen (für EF6 und höher befindet sie sich direkt darunter Tables). Dadurch werden Migrationen endgültig deaktiviert.

Episodex
quelle
7
Die Tabelle __MigrationHistory befindet sich direkt unter Tabellen, nicht unter Systemtabellen.
Peter Hedberg
6
@PeterHedberg Dies gilt für EF6 +. Für frühere Versionen war es unter System Tables.
Episodex
1
Sie können die Tabelle auch umbenennen, anstatt sie mit zu löschen sp_rename. Ich habe auch den Initialisierer deaktiviert.
NMrt
1

Ich habe gerade dieses "Problem" von gelöst

  1. Löschen der Tabelle "_MigrationHistory" aus der Datenbank.
  2. Löschen des Ordners "Migrationen" aus dem Projekt.
  3. Aktualisieren der EDMX-Datei.
  4. Projekt reinigen und neu erstellen.

Meine Umgebung ist

1. Visual Studio 2017 15.8.2
2. ASP NET MVC project
3. .NET Framework 4.6.1
4. Entity Framework 6.2.0
Entwickler
quelle
Darf ich fragen, was Sie in der EDMX-Datei aktualisiert haben? Ich verwende auch Database First und es werden immer noch die nicht vorhandenen Migrationstabellen abgefragt ... Danke!
Dalcam
Was passiert, wenn später Migrationen erforderlich sind _MigrationHistory? Wird automatisch eine neue Tabelle erstellt?
Sairfan