Entity Framework 使用時の注意点とか

EF 側

  • EF を利用するプロジェクトと同じプロジェクトに EF を含めることも可能だが、xxx.DAL みたいな名前の専用プロジェクトを新規に作成して、そちらで管理した方が良いかも(お好きな方で)
  • EF ライブラリは Nuget からインストールできる (Entity Framewok で検索すれば MS のが出てくる)。バージョンによって使える機能に結構差があるようなので、最新版を推奨
  • ライブラリをインストールしたら、当該プロジェクトに新しい項目を追加し、"ADO.NET Entity Data Model" を追加する
  • CodeFirst によるモデルから DB の更新もできるらしいが、自分は DB でスキーマ更新して、それを EF のモデルに反映させる派(お好きな方で)
  • モデル (edmx) を更新すると、edmx 配下の context.cs 等も自動更新されるので、これらのソースに直接手を加えるのは、NG (モデル更新時にこれらのファイルも初期化されるので)
  • edmx を更新した際、セキュリティテンプレートを更新するか的な確認ダイアログが表示されるが、これは全て「はい」を選ぶ。この処理で edmx 配下の自動更新ファイルが更新されるので、ここで更新拒否すると、不整合が発生する
  • edmx に一度不整合が発生した場合、edmx をエディタで直接開いて確認した方が良いかもしれない。例えばモデルの更新が正しく行えなかったりソース管理機能のマージで失敗すると、同じカラム名が edmx に重複定義されて、それが原因でモデルが表示できなくなったりしてしまうことがあるが、そうなると直接 edmx を確認したり、作り直したりする必要が出てくる
  • 上述したように、ソース管理機能のマージで失敗するとモデルのメタ情報が壊れて悲惨な目にあうので、EF プロジェクトのアイテムに関しては、マージ機能は使わない事を推奨。同時に複数人で更新しないとか、モデル更新するのは特定の人だけにするとかの運用が必要かと思われる。とにかく、マージは凄い勢いで壊れる。
  • Entities クラス名をかえたいとかであれば、edmx のエンティティコンテナー名とかで変更する必要がある
  • 名前空間も注意。特に他からコピーした時など
  • データアクセスのリトライ処理は自前で用意するのではなく、DbConfiguration で SetExecutionStrategy() を実行して、EF ライブラリ側で対応する。Azure SQL Database に接続しているのであれば、SqlAzureExecutionStrategy を使う。(接続の回復性と再試行ロジック)
  • 必ずしも DB の最新スキーマと常に同期させる必要はなく、プログラムから使用する DB リソースに関連する箇所が EF と同期されていれば、プログラムから EF を使う上では特に問題ない

EF 使う側

  • 接続先 DB は EF オブジェクト作る際に接続文字列を渡して、EF から DB を動的に切り替えられるようにする。こうすることで、アプリケーション設定の変更のみで dev, stg, prd など DB を切り替えることが出来る
  • EF オブジェクト作成時に接続文字列を渡して初期化させる件は、既定ではないので、EF 側に仕掛けを追加する必要がある。作成された DbContext クラスの Partial クラスを追加し、そちらで接続文字列を受け取り設定するコンストラクタを追加する (DbContext クラスを直接編集すると、前述したようにモデル更新時に初期化されて消えてしまうため)
  • DB 接続文字列は、EF 配置したプロジェクトの App.config に記載されているので、それを流用して使用する。Azure Web Apps や Functions 等であれば、アプリケーション設定に定義しておけばポータルから操作できるので、お手軽