Подтвердить что ты не робот

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

Я испытываю ошибку при попытке создать базу данных, используя следующий код. Обратите внимание, что проблема не возникает, если строка подключения не передается. Также проблема возникает, когда я запускаю программу в 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 поведения) InnerException: System.Data.SqlClient.SqlExid имя_объекта __MigrationHistory. Источник =.Net SqlClient Поставщик данных ErrorCode = -2146232060 Класс = 16 LineNumber = 1 Number = 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. в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический асинхронный , Тайм-аут Int32, Задача & задача, логическое asyncWrite) в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, TaskCompletionSource'rite системный объект во время выполнения). Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader(commandBehaviorlата ) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher. <> c__DisplayClassb.b__8() в System.Data.Entity.Infrastructure.Interception.InternalDispatcher'1.Dispatch [TInterceptionContext, TResultConxt] intertetertext операции взаимодействия (операция)., Action'1 выполняется, Action'1 выполняется) в System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader (команда DbCommand, DbComma ndInterceptionContext interceptionContext) в System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader (поведение CommandBehavior) в System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoremandomExe Entity Entity EntityCommandCommandeomCommand: Command()

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Database.SetInitializer<YourContext>(null);

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

Ответ 3

Я столкнулся с той же проблемой. Это означает, что EF не может найти таблицу истории __Migration. также обратите внимание, по какой-то причине это должно быть dbo.__ MigrationHistory (note dbo). Убедитесь, что вы запустили "update-database" по крайней мере один раз перед запуском Context

Ответ 4

Я забыл добавить имя базы данных в строку подключения. После того, как я добавил, он начал работать