Entity Frameworkコードの最初のDbContextで、入力されたテーブルのエンティティが表示されないのはなぜですか?
-
27-10-2019 - |
質問
アプリをテスト環境にデプロイしようとしていますが、EntityFrameworkをデータベースとうまく連携させることができません。開発では、データベース初期化子を使用してデータベースをシードしますが、これは問題なく機能しました。ただし、アプリケーションを実際のIISインスタンスに展開すると、データベースとのインターフェイスを取得できません。カスタム初期化ルールがまったく実行されないため、代わりにデータベースを手動で作成しています。
SQLスクリプトの開始点としてObjectContext.CreateDatabaseScript()を使用し、SSMSは2つの行が適切なテーブルに入力されていることを確認します。
アプリケーションの実行後に問題が発生します。カスタムメンバーシップとロールプロバイダーがありますが、どちらもデータベースに2つのロールが存在することを検出していないようです。
エンティティフレームワークにこれらの行が空ではないことを認識させるにはどうすればよいですか?現在、リポジトリ内でプライベートDbContextを使用してEntity Frameworkとの通信を処理しており、この問題が解決するまでカスタム初期化子を無効にしています。
データベースで役割を見つけようとするコード: ジェネラコディセタグプレ
データベースのRolesテーブルには次のものが表示されます。 ジェネラコディセタグプレ
LINQは、context.Rolesが空であるため、空のシーケンス例外を生成します。
解決 2
これは、各セッション中にデータベースを非揮発性DBセットアップにリセットするカスタムIDatabaseInitializer実装を備えたコードファーストプロジェクトから移行するために行った手順です。
まず、EntityFrameworkによって生成されたスキーマを開発者にコピーします。次のコードを実行し、出力をアクセス可能な場所に配置してプロジェクトを作成します(つまり、デスクトップ上のファイル、ブラウザー内の生のテキストなど)。 context は、 DbContext から継承するクラスのインスタンスです: ジェネラコディセタグプレ
次に、その呼び出しから返された文字列をSQLファイルに保存します。 EntityFrameworkメタデータテーブルを作成するコマンドを必ず削除してください。このコマンドは次のようになります。 ジェネラコディセタグプレ
次に、データベースをシードするコードを削除します。 AppSettingを使用したので、再コンパイルしてデプロイしなくても、デプロイ後にそのコードの使用法を簡単に切り替えることができます。 ジェネラコディセタグプレ
そのステートメントのすぐ外でも、データベースを初期化する必要がありますが、データベースが初期化されていない場合にのみ初期化が行われるように、必ず false を渡してください。 ジェネラコディセタグプレ
最後に、空のデータベースでセットアップSQLを実行して、適切なフィールドでテーブルを作成します。
アプリケーションをデプロイして実行すると、アプリケーションはデータベースに接続され、外部スクリプトにロードしたすべてのデータで通常どおりに機能する必要があります。私はこのメソッドをカスタムメンバーシップとロールプロバイダーで正常にテストしました。
他のヒント
コメントから判断すると、EntityFrameworkとデータベースの間に接続がないように見えます。使用しているEntityFrameworkのバージョンについては言及していませんが、最新(執筆時点では4.3)に更新されていると思います。
「データベースを手動で作成している」とおっしゃっています。テストプロジェクトを開いて、手動で作成したデータベースに基づいて新しいデータベースファーストモデルを作成してみませんか?これにより、少なくとも、構成でEntityFrameworkを使用できることが確認されます。 そこから、別のプロジェクトを最初から作成して、CodeFirstアプローチをテストします。