Invalid object name 'dbo.__MigrationHistory' using Database.Create; EF6.02 when connection string is passed in

Kir*_*eed 30 package-managers entity-framework-6

I experience an error when trying to create a database using the following code. Note the problem does not happen if the connection string is not passed in. Also the problem happens when I run the program in the IDE. It does not happen if I run the program .exe or if I run the unit tests within the IDE.

However if the database is created by running the unit tests or by running the .EXE then the __MigrationHistory table is created in the main tables section, not the system tables.

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

I don't get the problem if I just use something like

var db1 = new Context();
db1.Database.CreateIfNotExists();
Run Code Online (Sandbox Code Playgroud)

I have found some documentation here but it confuses me. I am installing from a "stable build" surely I aren't experiencing something from 2012? What could I be doing wrong with PM?

The error message for the problem is....

System.Data.Entity.Core.EntityCommandExecutionException occurred
HResult=-2146232004 Message=An error occurred while executing the command definition. See the inner exception for details.
Source=EntityFramework StackTrace: at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) InnerException: System.Data.SqlClient.SqlException HResult=-2146232060 Message=Invalid object name '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 exception, 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, Boolean& dataReady) 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 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) 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, Action`1 executing, Action`1 executed) at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext) at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) InnerException:

Paw*_*wel 67

发生这种情况是因为EF对__MigrationsHistory表进行了一些探测.例如,您可以将EF与未使用EF迁移创建的现有数据库一起使用,但EF无法知道它,因此它尝试连接到数据库并使用该表进行检查.如果该表不存在,则抛出异常.EF然后捕获异常并做正确的事情(例如,如果需要,则创建__MigrationsHistory表,或者不使用迁移继续).

通常,在没有调试器的情况下运行时,您不会看到此异常.然而在调试代码时当选择打破时抛出的异常设置你会看到所有,即使它们在内部处理的,正在抛出无法到达您的代码例外执行.抛出异常时,默认设置不会中断,但仅在抛出未处理的异常时才会中断.您可以通过选中/取消选中Debug - > Exceptions对话框中"Thrown"列中的复选框来更改设置.

在VS 2017中,您可以使用Debug-> Windows-> Exception Settings打开异常设置.如果右键单击"公共语言运行时异常",则可以选择"恢复默认值",以便在抛出大多数异常时禁用破坏程序.

  • 谢谢,我会检查.我在项目中没有Migrations文件夹 - 所以它为什么要尝试制作表格让人感到困惑. (2认同)
  • 感谢您提供此信息,这很有用,因为应用程序见解仍在监视此异常 (2认同)

Dan*_*rod 10

您可以通过将此数据库初始化为您的上下文的构造函数来关闭数据库的数据库初始化:

Database.SetInitializer<YourContext>(null);
Run Code Online (Sandbox Code Playgroud)

这应该可以防止尝试访问dbo.__MigrationHistory.