webentwicklung-frage-antwort-db.com.de

Ungültiger Objektname 'dbo .__ MigrationHistory' using Database.Create; EF6.02, wenn Verbindungszeichenfolge übergeben wird

Wenn ich versuche, eine Datenbank mit dem folgenden Code zu erstellen, tritt ein Fehler auf .. Beachten Sie, dass das Problem nicht auftritt, wenn die Verbindungszeichenfolge nicht in übergeben wird. Außerdem tritt das Problem auf, wenn ich das Programm in der IDE ausführen. Es passiert nicht, wenn ich das Programm .exe oder die Komponententests in der IDE ausführe.

Wenn die Datenbank jedoch durch Ausführen der Komponententests oder durch Ausführen der EXE-Datei erstellt wird, wird die __MigrationHistory-Tabelle im Abschnitt Haupttabellen und nicht in den Systemtabellen erstellt.

public Context(string connString, bool AddInitialRecords )
    : base(connString ?? "MyContextName")
{
    this.CheckDatabase(AddInitialRecords);
}

public void CheckDatabase(bool AddInitialRecords)
{
    if (this.Database.Exists())
    {
         // upgrade stuff
    }
    else
    {
       Database.Create();  // error occurs here
        // seeding stuff 
    }
}

Ich bekomme das Problem nicht, wenn ich nur so etwas benutze 

var db1 = new Context();
db1.Database.CreateIfNotExists();

Ich habe einige Dokumente gefunden hier , aber das verwirrt mich. Ich installiere von einem "stabilen Build" aus. Sicherlich erlebe ich nichts von 2012? Was könnte ich falsch mit PM machen?

Die Fehlermeldung für das Problem lautet ....

System.Data.Entity.Core.EntityCommandExecutionException ist aufgetreten
HResult = -2146232004 Nachricht = Fehler beim Ausführen von Befehlsdefinition. Einzelheiten finden Sie in der inneren Ausnahme.
Source = EntityFramework StackTrace: at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, Verhalten von CommandBehavior) InnerException: System.Data.SqlClient.SqlException HResult = -2146232060 Message = Ungültiger Objektname "dbo .__ MigrationHistory" . Source = .Net SqlClient-Datenanbieter Fehlercode = -2146232060 Klasse = 16 LineNumber = 1 Anzahl = 208 Procedure = "" Server =.\SQLEXPRESS Zustand = 1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError (SqlException-Ausnahme, Boolean breakConnection, Action`1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj. at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData () at System.Data.SqlClient.SqlDataReader.get_MetaData () at System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32-Zeitlimit, Task & Task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String Methode, TaskCompletionSource`1-Abwicklung, Int32-Timeout, Task & Task, .____.). at System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String Methode) at System.Data.SqlClient.SqlCommand.ExecuteReader (CommandBehavior Verhalten, String-Methode) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (Verhalten von CommandBehavior ) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8 () at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch [TInterceptionContext, TResult] (Func`1 Operation, TInterceptionContext InterceptionContext, Aktion`1 ausgeführt, Aktion`1 ausgeführt) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (Befehl DbCommand , DbCommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader (Verhalten von CommandBehavior ) at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, Verhalten von CommandBehavior) InnerException:

28
Kirsten Greed

Dies geschieht, weil EF die __MigrationsHistory-Tabelle prüft. Beispielsweise können Sie EF mit einer vorhandenen Datenbank verwenden, die nicht mit EF Migrations erstellt wurde. EF hat jedoch keine Möglichkeit, sie zu kennen. Daher versucht sie, eine Verbindung zur Datenbank herzustellen, und verwendet die Tabelle, um dies zu überprüfen. Wenn die Tabelle nicht existiert, wird eine Ausnahme ausgelöst. EF fängt dann die Ausnahme ab und führt das Richtige aus (erstellt z. B. bei Bedarf die Tabelle __MigrationsHistory oder fährt ohne Verwendung von Migrationen fort). 

Im Allgemeinen wird diese Ausnahme nicht angezeigt, wenn Sie ohne den Debugger ausgeführt werden. Beim Debuggen Ihres CodesUNDwerden jedoch beim Festlegen der Option zum Unterbrechen der Ausführung, wenn eine Ausnahme ausgelöst wird, alle Ausnahmen angezeigt, die ausgelöst werden, selbst wenn sie intern behandelt werden und Ihren Code niemals erreichen. Die Standardeinstellung ist, nicht zu brechen, wenn die Ausnahme ausgelöst wird, sondern nur, wenn eine Ausnahme ausgelöst wird, die nicht behandelt wird. Sie können die Einstellung ändern, indem Sie ein Kontrollkästchen in der Spalte "Ausgelöst" im Dialogfeld "Debug -> Ausnahmen" aktivieren/deaktivieren.

In VS 2017 öffnen Sie die Ausnahmeeinstellungen mit Debug-> Windows-> Ausnahmeeinstellungen. Wenn Sie mit der rechten Maustaste auf "Common Language Runtime Exceptions" klicken, können Sie "Restore Defaults" auswählen, wodurch das Brechen Ihres Programms deaktiviert wird, wenn die meisten Exceptions ausgelöst werden.

66
Pawel

Sie können die Datenbankinitialisierung der ersten Datenbank für Ihre Datenbank deaktivieren, indem Sie dies dem Konstruktor Ihres Kontexts hinzufügen:

Database.SetInitializer<YourContext>(null);

Dies sollte den Versuch verhindern, auf dbo.__MigrationHistory zuzugreifen.

8
Danny Varod

Ich stand vor demselben Problem. Dies bedeutet, dass EF die Migrationsprotokolltabelle nicht finden kann. Beachten Sie auch, dass es aus irgendeinem Grund dbo sein muss .__ MigrationHistory (Anmerkung dbo). Stellen Sie sicher, dass Sie "update-database" mindestens einmal ausgeführt haben, bevor Sie den Kontext ausführen

1
Rishabh Jain

Ich habe vergessen, den Datenbanknamen in meine Verbindungszeichenfolge aufzunehmen. Nachdem ich hinzugefügt hatte, fing es an zu arbeiten

0
Charlie