2012-06-17 11 views
5

私は以前は常にオブジェクトを扱うために直接データアクセスを使用していました(クエリを手動で実行し、結果をデータオブジェクトにマッピングする)。マイクロソフトでは現在、顧客がデータオブジェクトのクエリに使用するようにEFを推進していることは分かっています。エンティティフレームワークとダイレクトデータアクセス

私はこれに対して、コミュニティのためのいくつかの質問を持っている: -

  • あなたは複雑なデータベースを持っている場合は、百個のテーブルすなわちカップル、ストアドプロシージャ、ビューのまともな量、すべてが3NFにあります。トレードオフに値する2つのスキーマ(1つのローカルEFスキーママッピングと1つのDB)を管理する負担はありますか?

  • データアクセスを増やし始めると、2つのキャッシングはどのように比較されますか?私はダイレクトアクセスであなたが望む任意のキャッシングを実装できることを知っていますが、EFはこれと同様のことを許可していますか?

  • SQLをNSFに書き込むことを強く求めている人たち(SQL-NS、Linq-to-SQL)の製品を殺すマイクロソフトの歴史を考えてみましょう。

私は現在、大きく、現時点でダイレクトアクセスを使用しますが、移行を検討する(つまり、今後、新たなクエリで、まだそれらすべてにバックトラックではない)、およびからのアドバイスを探していましたよ言ったようにコミュニティの残りの部分を自分たちの見解に置き換える。

答えて

4

複雑なデータベース、つまり何百ものテーブルがある場合は、 相当量のストアドプロシージャ、ビュー、すべてが3NFにあります。 は、トレードオフの価値がある2つのスキーマ(1つのローカルEFスキーママッピングと 1つのDB)を管理する負担がありますか?

自動化されたツールを使用すると、EFスキーマを最新の状態に保つことができますので、それほど悪くはありません。

データアクセスを強化し始めたら、キャッシングはどのようにして の2つで比較されますか?私はダイレクトアクセスであなたが望むキャッシュの任意の形式を実装することができることを知っています EFは同様のことを許可しますか?

私が知る限り、はい。

彼らのために書くために人々を重く 後の製品を殺すそれらをプッシュし、取得のMicrosoftの歴史を考えると(SQL-NS、 LINQのツーSQL)これはEFに起こることがいかにlikley?

この質問はあまりにも仮説的です。

私がEFで持っている問題はパフォーマンスです。そうです、あなたは急速な発展を遂げていますが、パフォーマンスを引き離します。 EFを使用すると、悪いと遅いコードを書くのは本当に簡単です。あなたが何をしているのかを100%知っていなければ、後で重大なパフォーマンス上の問題に終わることがあります(特に、何百ものテーブルを扱っている場合) 。

私が示唆しているのは、DapperやMassiveのようなMicro-ORMフレームワークを試してみることです。そのような多くのパフォーマンスを犠牲にすることはありませんが、従来のAdo.netアプローチよりも保守が簡単です。

しかし、ちょっと、それは私だけです、あなたはEFを愛するかもしれません。

+1

+1。 '大きな'フレームワークは少し遅いかもしれませんが、特に不用意に使用された場合は、開発プロセス中にかなり便利です。どこかにパフォーマンスの問題が本当にある場合、最適化の時間があります。少なくともDapperはこのトリックを行うべきです - 私は、直接データアクセスが「手動」マッピングを行うのは面倒すぎると考えています。 :) –

1

EFや他のORMツールに留意すべき点は、何か(EFやLinq2Entitiesの場合はLinq式ツリー)をSQL文に変換することだけです。抽象化とパースのレイヤーが追加されているため、ストレートクエリの方が常に遅くなります。しかし、通常、開発者はORMを使用する方が簡単です。幸い、ほとんどのORM(特にEFについては不明)は、必要なときに直接クエリを実行する方法を提供します。

あなたは「複雑な」データベースを持っていると言いますが、これは通常、複雑なクエリを持つことを意味します。それはLinqが本当に好きではないものです。たとえば、13個のテーブルを結合するクエリがあって、返されるほとんどのカラムがdb関数に渡され、大量のcase文と複数のサブセレクションがある場合、Linqにはほとんど変換できません。簡単なことは、その複雑さをビューで包み込み、EFを使用してビューをクエリすることです。

EFは、実際のクラスがDBを模倣するように構築されているため、開発者にインテリセンスを提供します。 EFの内容がどのように配置されているかに応じて、クラスがすべてDBから生成されるようにプロジェクトを設定できます。そうすれば、誰かがDBスキーマを編集したり、列データ型を変更するとC#コードはもはやコンパイルされません。伝統的な直接SQL問合せでは、ランタイム(または統合テスト時間)までは決して見つけられません。

これはすべてのトレードオフです。IMOは、両方を試して、どちらが良いかを確認するか、いずれかのオプションを提供するような方法でソリューションを設計することです。最後に私が取り組んだアプリケーションでは、他のデータアクセスクラスが使用する "データベースファクトリ"クラス(ファクトリパターン)を用意していましたが、工場に古いADO.NETコマンドオブジェクトを依頼するか、 ORMオブジェクト(EFの場合はContextですが、SubSonicを使用していたので代わりにIQueryableの実装でした)。そうすれば、EFを通して "シンプルな"クエリを、SQLで "複雑な"クエリを実行できます。

+0

"だから、誰かがDBスキーマを編集したり、カラムデータ型を変更したりすると、C#コードはコンパイルされなくなります。"これは本当に真実ではありません。もし誰かがあなたのスキーマをDB側で変更し、 EFスキーマを変更すると、まったく同じ状況になります。実行時まで見つからないでしょう... – walther

+0

私の声明の意図は本当に「あなたはあなたのプロジェクトをコンパイルすると、クラスは再生成されるので、基本的にビルドするたびに、DBスキーマをC#コードの関係に検証します。現実的には、それはコンパイルごとに多くのオーバーヘッドと時間です。私は通常、Continuous Integrationサーバーを常にDBから再構築するように設定し、生成されたクラスをソース管理にチェックインしません。私の特定の状況では、C#マッピングに対するDBスキーマは、CIサーバーが構築されるたびに検証されます。 – CodingWithSpike

1

直接データアクセスと比較したEFの主な利点は、開発者の生産性です。

アセンブリコードを書く開発者はごくわずかですが、コンパイラに生成させることはほとんどありません。 EFのようなツールがうまくいくにつれて、より多くのものを使い、SQLの作成をやめます。

ただし、必要なパフォーマンスを得るために余分なコントロールが必要な場合があるため、SQLコードを記述する必要があります。まだいくつかのアセンブリコードが書かれているのと同じです。

動作するソリューションの変換にはビジネス上の価値はありません。新しい開発のためにEFを試すことができます。

関連する問題