マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

Entity Frameworkを利用する上での懸念をまとめてみた。

外部スキーマ云々

JOINのサポート

JOINの使用

JOINを使用しない内部結合

集計処理のサポート

性能云々

全体的に、

から

などがブラックボックス化されているため、
Entity Framework自体の仕様に精通していないと、

ハイパフォーマンスな実装をすることができない。

という問題がある。

検索SQLが検索キーや射影の列名を指定しない

foreachでデータアクセスした場合など、
検索SQLが検索キーや射影の列名を指定しないので性能的に問題になる。

Iterator的にDBアクセスしてしまう。

以下の様な手段により、処理対象のEntityをメモリに起こしてしまう。

ToArray?()メソッド

この場合、ToArray?()メソッドを使って、はじめに結果を確定させる。

var YYYYYs = context.YYYYYs.ToArray();

Load()メソッド

この場合、Load()メソッドを使って、DbContext?内にデータをキャッシュさせる。

context.YYYYYs.Load();

この後、context.YYYYYsにアクセスしてもSQLは実行されない。

大量データ処理

ライブラリがいくつかある。(非 MS 製、NuGet からインストール可能)

LINQ to Object vs LINQ to Entities

処理される場所が異なる

となる。

処理結果が異なる

処理される場所だけでなく、処理結果が異なることがある。

DBMSの照合順序などの関係により、
処理される場所によって、ソート(OrberBy?)順が異なるためである。

トラッキングしない

AsNoTracking?()メソッドでCollectionを取得すると、
Entity Statesのトラッキングをしなくなる。

var YYYYYs = context.YYYYYs.AsNoTracking().ToArray();

これにより、使用するメモリ量を削減できる。

コードファースト云々

マイグレーション

コードファーストのデータモデルクラスの変更をもとに、
既存のデータを残したままデータベースのテーブルを変更する機能。

規約

コードファーストでは規約に基づいてEntityとDatabaseを紐付ける。

属性

属性による規約

項番属性名説明
TableEntityとTable間のマッピング
ColumnEntityのPropertyとTableのColumn間のマッピング
ComplexType?Entityの複数のProperty(Properties)とTable間のマッピング
ComplexType?の複数のProperty(Properties)は、別のTableに切り出される。
KeyEntityのPropertyを対応するTableのPrimaryKey?に設定する。
RequiredEntityのPropertyに対応するTableのColumnをNOT NULLに設定する。
MVCのModelMetadata?として検証処理に使用される。
MaxLength?EntityのPropertyに対応するTableのColumnのデータ長を設定する。
MVCのModelMetadata?として検証処理に使用される。
IndexEntityのPropertyに対応するTableのColumnを使用した非クラスタ化・インデックスを作成する。
NoMapped?EntityのPropertyをDatabaseにマップしない。

その他、DbContext?を継承したContextのコンストラクタで接続文字列を決定できる。

Fluent API

Fluent APIによる規約

ナビゲーション・プロパティ

エンティティ間の関連(アソシエーション)を表す。

批判云々

信任投票

ORMの問題

気付き

Entity FrameworkをキャンセルしたASP.NET Identity
UserStoreを実装して「ORMの問題だな。」と思った点は、

プログラムの

実装者にとって「難しい。」ってトコロではないかと思う。

背景

等と言った点だと思う。

エンプラ領域でのミスマッチ

基幹系システムでは以下の理由でミスマッチと判断されることが多い。

インピーダンス・ミスマッチ

概念モデルに対してプログラミングを採用している。

スキーマ構造の変更

内部実装とその動作がブラックボックス

SQLが、LINQ to Entityのエンジンに生成される形であり、
また、内部実装とその動作がブラックボックスになっているため(※1)
それらが明確にならないと設計、チューニング、問題分析などが困難。

従って(特に日本の)エンタープライズ・アプリケーションでは敬遠されている。
これは、JavaのJava8でJPAでHibernateでJinqが敬遠されるのと≒。


Tags: :.NET開発, :データアクセス, :ADO.NET, :Entity Framework, 性能?


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS