Недопустимое имя объекта 'dbo .__ MigrationHistory' с использованием Database.Create; EF6.02, когда строка подключения передается в

entity-framework-6 package-managers

Вопрос

При попытке создать базу данных с использованием следующего кода возникает ошибка. Обратите внимание, что проблема не возникает, если строка подключения не передается. Также проблема возникает, когда я запускаю программу в среде IDE. Это не происходит, если я запускаю программу .exe или запускаю модульные тесты в среде IDE.

Однако, если база данных создается путем запуска модульных тестов или запуска .EXE, тогда таблица __MigrationHistory создается в разделе основных таблиц, а не в системных таблицах.

  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 
        }

Я не получаю проблему, если я просто использую что-то вроде

  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 
        }

Я нашел здесь некоторую документацию, но меня это смущает. Я устанавливаю из «стабильной сборки», конечно, я ничего не испытываю с 2012 года? Что я могу делать с PM?

Сообщение об ошибке для проблемы ...

Исключено событие System.Data.Entity.Core.EntityCommandExecutionException
HResult = -2146232004 Сообщение = Произошла ошибка при выполнении определения команды. Подробнее см. Внутреннее исключение.
Source = EntityFramework StackTrace: at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) InnerException: System.Data.SqlClient.SqlException HResult = -2146232060 Сообщение = Недопустимое имя объекта 'dbo .__ MigrationHistory ». Source = .Net SqlClient Data Provider ErrorCode = -2146232060 Class = 16 LineNumber = 1 Number = 208 Procedure = "" Server =. \ SQLEXPRESS State = 1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое разрытие соединения , Action`1 wrapCloseInAction) при System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, Boolean, Boolean callerHasConnectionLock asyncClose) в System.Data.SqlClient.TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) в System.Data.SqlClient.SqlDataReader.TryConsumeMetaData () в System.Data.SqlClient.SqlDataReader.get_MetaData () в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task & task, Boolean asyncWrite) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, метод String, завершение TaskCompletionSource`1, тайм-аут Int32, задача и задача, логическое имя asyncWrite) в системе .Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (CommandBehavior поведение) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8 () в System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch [TInterceptionContext, TResult] (операция Func`1, TInterceptionContext interceptionContext, Action`1 execute, Action`1 выполняется) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (команда DbCommand, Db CommandInterceptionContext interceptionContext) в System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader (поведение CommandBehavior) в System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (EntityCommand entityCommand, поведение CommandBehavior) InnerException:

Принятый ответ

Это происходит потому, что EF делает некоторое исследование для таблицы __MigrationsHistory. Например, вы можете использовать EF с существующей базой данных, которая не была создана с использованием EF Migrations, но EF не знает, что она пытается подключиться к базе данных и использует таблицу для проверки этого. Если таблица не существует, будет выбрано исключение. EF затем перехватывает исключение и делает правильную вещь (например, создает таблицу __MigrationsHistory, если это необходимо или продолжается без использования миграции).

В общем случае вы не увидите этого исключения при работе без отладчика. Однако при отладке вашего кода И когда будет установлен вариант разблокирования выполнения при вызове исключения, вы увидите все исключения, которые будут выбрасываться, даже если они будут внутренне обработаны и никогда не достигнут вашего кода. Значение по умолчанию не прерывается при вызове исключения, но только тогда, когда генерируется исключение, которое не обрабатывается. Вы можете изменить этот параметр, установив / сняв флажок в столбце «Брошенный» в диалоговом окне «Отладка -> Исключения».

В VS 2017 вы открываете настройки исключения с помощью Debug-> Windows-> Exception Settings. Если вы щелкнете правой кнопкой мыши по «Исключениям общего времени выполнения языка», вы можете выбрать «Восстановить значения по умолчанию», которые запрещают разрывать вашу программу, когда большинство исключений выбрасывается.


Популярные ответы

Вы можете отключить инициализацию первой базы данных для вашей базы данных, добавив ее в конструктор контекста:

Database.SetInitializer<YourContext>(null);

Это должно предотвратить попытку доступа к dbo.__MigrationHistory .




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему