web-dev-qa-db-ja.com

Entity Frameworkを使用する必要がありますか?

現在、次のスタックがあります。

  • VS 2005
  • ウェブフォーム
  • SQL Server 2005
  • IIS 6

これへの移行を計画しています:

  • VS 2010
  • MVCおよびWebフォーム
  • SQL Server 2008
  • IIS 7

私の質問は、VS 2010でMVCに移行するときに、エンティティフレームワーク(または別のORM)、マイクロORM( Massive など)、または単なるSQLを使用する必要があるかどうかです。

私がVS 2010について読んだすべてのチュートリアルは、データトランザクションにEntity Frameworkを使用することを目的としていますが、それは予見可能な将来(5年以上)に使用できるでしょうか?

必要に応じて、クライアントのアプリケーションは10〜1,000人のアクティブユーザーを持つことができます。

31
guanome

私は最近、インラインSQLクエリの使用からEFの使用に切り替えました。これが私が見つけたものです:

長所

  • DALの構築がはるかに高速です(SQLクエリを記述しないことが大好きです!)
  • メンテナンスがはるかに簡単
  • インラインSQLステートメントを作成する前に入力を解析することを覚えておく必要がなくなりました。つまり、SQLインジェクション攻撃の可能性が低くなります(もちろん、クエリによっては可能ですが、可能性ははるかに低くなります)。

短所

  • 複数のデータベースにまたがることはできません...少なくとも簡単にはできません
  • すべてのエンティティ(テーブル、ビューなど)には主キーが必要です
  • 100個以上の必須列テーブル(テーブルデザインではない)の単一の列を更新する場合は、100列すべてをプルダウンして更新する必要があります。または、ストアドプロシージャを使用します。
  • 新しいレコードが追加された後、SQLサーバーで定義されたいくつかのデフォルト値がエンティティモデルにプルされないという問題がありました。通常、これは計算された値、またはINSERTトリガーで追加される値を使用します
  • ときどき、SQLクエリが正しく記述されず、実行が遅くなります。クエリの実行が遅い場合は、SQLトレースを実行して、EFの動作を確認します。そのクエリをSPまたはビューとして再作成できる可能性があります。これはそれほど頻繁には発生しません。
  • SQL Serverで外部キーが定義されていないテーブル間の関連付けを作成しようとすると、いくつか問題が発生しました。通常、それはEFが1:0-1を使用したい1:0-*関係を作成しようとしているためです。

私はEFのエキスパートではないので、おそらくいくつかのことを逃しました。これらは、インラインSQLからEntity Frameworkに切り替えるときに私が過去に遭遇したことがわかっているアイテムにすぎません。切り替えができてうれしいですが、気まぐれなためにEFを本当に嫌うこともあります。

45
Rachel

Entity Frameworkは生産性ツールです。そうしない正当な理由がない限り(たとえば、SQL 2000を使用しているか、テクノロジを強化する時間がない場合)、自由に最適なツールを使用してください。

そうは言っても、エンティティのコンセプトはMVCパターンのモデルに非常によく翻訳されると思います。モデルとテーブルとの1対1の関係を持つことは悪い習慣ですが、エンティティの観点から考えると、クリーンなデザイン、読みやすいコード(特にLINQの場合)が生成される傾向があります。

Entity Frameworkは、マイクロソフトによって積極的にサポートされています。 「サポートはX年間続く」と言っている魔法の水晶玉を持っている人はいません。エンティティが今後5年間で死ぬと信じる理由はありません。

12
P.Brian.Mackey

別の潜在的な解決策は、V.S。で提供されているものとは別のエンティティフレームワークライブラリを使用することです。ウェブ上にいくつかあります。

Entity/3レイヤーフレームワークのコンセプトは、しばらく前から存在しており、Microsoftが独自の「公式」フレームワークをリリースする前に、他の多くの開発者と同様にいくつかのカスタムライブラリと連携しています。

長所

Microsoftの定数ライブラリ/フレームワークの変更に悩まされることなく、エンティティ(D.A.L.)フレームワークの利点を活用できます。

いくつかのdtabaseブランドを使用するなど、既存の公式ライブラリでは使用できない可能性があるライブラリに機能を追加する。

短所

ライブラリまたはツールをサポートする必要があります。エンティティを生成するためのエンティティジェネレータコードツールを使用することは非常に一般的です。

4
umlcat

問題と既存のソリューションに基づいてアーキテクチャ上の決定を行う必要があります。他のテクノロジーと同様に、長所と短所があります。

私は個人的には通常、新しい開発にエンティティフレームワークを使用しますが、既存の機能するコードを書き直すことはしません。そうすれば、将来の開発のスピードが得られますが、コードの変換に多くの時間を費やす必要はありません。このアプローチの欠点は、一貫性が低下することです。

3
Tom Squires

あなたの状況では、私は間違いなくEntity Frameworkを使用しますが、MVCでうまく機能することがわかりました。
ここにいくつかの本当の理由と指針があります。

  • Linqは使用する喜びであり、遅延実行も非常に便利です。
  • モデルを生成できます(ただし、mvcを使用する場合は、ビューモデルをデータモデルと組み合わせて使用​​することをお勧めします。この方法を使用すると、検証とモデルバインディングを大幅に簡略化できます automapper 変更をデータモデルにマッピングします)。

ただし、ORMの使用について学習する必要がある多くの事項があります。

  • コンテキストが何をするか(エンティティ追跡)
  • コンテキストを作業単位として使用する必要があること
  • 並行性について覚えておいてください。EFはオブジェクトが古くなったことを通知しますが、(タイムスタンプなどを維持する必要があるため)要求全体で並行性を適切に処理する場合は注意が必要です。

考慮すべき事柄

  • トリガーとORMは併用できません。代わりにORMイベントを使用してください。
  • すべてのテーブルにpromaryキーがあることを確認してください。

また、既存のデータベースがある場合でも、コードファーストアプローチを強くお勧めします。

  • 規約により、データベースを変更するときにマッピングやクラスを再生成する必要はありません。
  • モデルに検証やその他のロジックを配置する方が簡単です。
  • 既存の巨大なデータベースがある場合は、コードジェネレーターを使用してそれらを作成できます。
2
Daniel Little