ASP.net MVCでコンテキストを別プロジェクトに分離する
はじめに
Web(MVCなアプリケーション)で使用するデータベースを他のプロジェクトからいじれると便利なことが多いです。コンソールからデータベースを参照するときなど。
そういう時ってWebアプリケーションの本体を参照して紐付けてしまうと大変なことになってしまうので、モデルは別プロジェクト(クラスライブラリ)として独立させた方が便利なはずです。で、モデルを分離するならデータベースにアクセスする部分(DbContext)もクラスライブラリとして独立させてしまうべきだろうというのが動機です。
こんな感じ
Entity Framework 6のCode first前提です。
構成
プロジェクトの構成はこのような感じで。
─┬─Application.Web │ …Webアプリケーション本体 │ ├─Application.DataAdapter │ …データベースアクセスクラス │ ├─Application.Entity │ …データベースのモデル │ ├─Application.ConsoleClient │ …コンソールアプリケーション(管理プログラムなど) │ └─Application.TestProgram …ちょっとしたテストを書くプロジェクト
注意点
特になし。プロジェクトの参照設定をきちんと設定できれば特に問題になる部分はないかと。
マイグレーションで困った!
で、まぁ順調に実装していたわけなんですが何だかマイグレーションの調子がよろしくない。
データベースの作成後、'xxxxx' コンテキストの背後にあるモデルが変更されました。 Code First Migrations を使用したデータベースの更新を検討してください (http://go.microsoft.com/fwlink/?LinkId=238269)。
というエラー。リンク先に書いてあるマイグレーションの手順は全部試してみたんだがなぁ・・・
解決
というわけで四苦八苦していたわけなんですが、なんともマヌケなことで、プロジェクトを分離したせいで マイグレーションツールがコンテキストのクラスを見失っていたのが問題みたいです。
データ ポイント - 複数モデルを対象とする EF6 Code First Migrations
このサイトに書いてあるとおりに、分離したコンテキストにそれぞれマイグレーションの設定をしてあげることで、うまくマイグレーションできるようになりましたとさ。トホホ。
おわりに
うむ。スッキリした。