Неверное имя объекта «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 
    }
}

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

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

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

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

System.Data.Entity.Core.EntityCommandExecutionException
HResult = -2146232004 Сообщение = Произошла ошибка при выполнении определения команды. Смотрите внутреннее исключение для деталей.
Source = EntityFramework StackTrace: в System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands (поведение EntityCommand entityCommand, CommandBehavior). ». Источник = .Net SqlClient Поставщик данных ErrorCode = -2146232060 Класс = 16 LineNumber = 1 Число = 208 Процедура = "" Сервер =. \ SQLEXPRESS State = 1 StackTrace: at System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection , 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.SqlCecuentReqSendingReaderSignSigning System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический async, Тайм-аут Int32, Задача и задача, логическое asyncWrite) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, TaskCompletion SystemWainTelement TaskSlayle для источника1). DATA поведение) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8 () в System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch [TInterceptionContext, TResultConte] (операция Func`1, T interceptionContext, действие `1 выполняется, действие` 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.ExecuteStoreCommande Entity EntityCityCommandementCityCommande Entity Entity Entity Entity EntityCommandCommande)

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

Это происходит потому, что 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
Является ли этот КБ законным? Да, узнайте, почему