web-dev-qa-db-ja.com

Database.Createを使用した無効なオブジェクト名 'dbo .__ MigrationHistory'。 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();

私はいくつかのドキュメントを見つけました here しかし、それは私を混乱させます。 「安定したビルド」からインストールしていますが、確かに2012年から何かが発生していませんか? PMで何が間違っているのでしょうか?

問題のエラーメッセージは...です。

System.Data.Entity.Core.EntityCommandExecutionExceptionが発生しました
HResult = -2146232004 Message =コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。
Source = EntityFramework StackTrace:System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehavior behavior)InnerException:System.Data.SqlClient.SqlException HResult = -2146232060 Message = Invalid object 「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)System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj、Boolean callerHasConnectionLock、Boolean asyncClose)at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavids、SqlCommand cmdHandler、BulkDataStateHandler stateObj、Boolean&dataReady)System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()at System.Data.SqlClient.SqlDataReader.get_MetaData()at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior runBehavior、String resetOptionsString) System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、Boolean SystemのSystem.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、ブールreturnStream、Stringメソッド、TaskCompletionSource`1完了、Int32タイムアウト、Task&タスク、ブールasyncWrite)でのasync、Int32タイムアウト、Task&タスク、ブールasyncWrite) .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動作)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実行、Action`1実行)at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command、Db System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)のCommandInterceptionContext interceptionContext)System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand、CommandBehavior behavior)のInnerException:

30
Kirsten Greed

これは、EFが__MigrationsHistoryテーブルに対して何らかの調査を行うために発生します。たとえば、EF Migrationsを使用して作成されたものではない既存のデータベースでEFを使用できますが、EFはそれを知る方法がないため、データベースに接続を試み、テー​​ブルを使用してこれを確認します。テーブルが存在しない場合、例外がスローされます。 EFは例外をキャッチして正しいことを行います(たとえば、必要に応じて__MigrationsHistoryテーブルを作成するか、移行を使用せずに続行します)。

一般に、デバッガなしで実行する場合、この例外は表示されません。ただし、コードをデバッグするとき[〜#〜] and [〜#〜]例外がスローされたときに実行を中断するオプションが設定されている場合、例外がスローされても、スローされているすべての例外が表示されます。内部的に処理され、コードに到達することはありません。デフォルト設定では、例外がスローされたときにブレークするのではなく、処理されていない例外がスローされたときにのみブレークします。設定を変更するには、[デバッグ]-> [例外]ダイアログの[スロー]列のチェックボックスをオンまたはオフにします。

VS 2017では、[デバッグ]-> [Windows]-> [例外設定]を使用して例外設定を開きます。 「共通言語ランタイム例外」を右クリックすると、ほとんどの例外がスローされたときにプログラムの破損を無効にする「デフォルトの復元」を選択できます。

67
Pawel

これをコンテキストのコンストラクタに追加することにより、データベースのコードファーストデータベース初期化をオフにできます。

Database.SetInitializer<YourContext>(null);

これにより、dbo.__MigrationHistory

9
Danny Varod

私は同じ問題に直面しました。これは、EFが__Migration履歴テーブルを見つけることができないことを意味します。また、何らかの理由でdbo .__ MigrationHistoryである必要があることに注意してください(dboに注意)。コンテキストを実行する前に、「データベースの更新」を少なくとも1回実行したことを確認してください

1
Rishabh Jain

接続文字列にデータベース名を追加するのを忘れました。追加した後、動作し始めました

0
Charlie