41

長所と短所などに関するトピックに関するかなりの数の投稿を読んだので、この質問は以前に何度も尋ねられたことを知っていますが、どのアプローチが自分に適しているかまだ判断できません。私は Web プログラミングの初心者で、SQL DB 管理者 / レポート作成のバックグラウンドを持っています。将来的には 30 ~ 40 のテーブルを持つことになるかもしれない独自の Web サイトを構築することにしました。

私は両方のアプローチを見てきましたが、デザイナーのシンプルさが好きで、モデル全体を目の前で見るのが好きなため、Entity Model アプローチを好みます。これは、1 つのスナップショットで全体像を示します。また、私は強力なプログラマーではありませんが、DbContext ジェネレーター テンプレートを使用して POCO を生成し、クラス間のすべてのリンクを行う方法に感銘を受けました。

ただし、私はモデル ファースト アプローチが好きですが、いくつかの欠点があると感じています。それらが実際の欠点であるかどうかはわかりません。それとも、モデル ファースト アプローチとコード ファースト アプローチについて十分に理解していないだけです。これには新しい。

モデル ファーストのアプローチを使用するのをためらう理由は次のとおりです。

- 主に、MVC 3 を使用したモデル ファースト アプローチのチュートリアルを見つけるのに苦労しているためです。 POCO を再生成しても失われない変更。MVC 3 関連のほとんどのチュートリアルでは、Code first アプローチを使用しているようです。ほとんどの人は、これはチューターが EF に集中するのではなく、tuts でより多くの MVC を表示したいためだと言います。個人的には、Microsoft が Code First の方法論を他の方法論よりも支持しているためだと思います :)

- バディ クラスを作成するのが良い方法である場合、MVC 3 についてこれを示す多くのチュートリアルが見つからないのはなぜですか? Buddy Classes は View Models の別名ですか? また、MVC 3 で使用されているこれらのバディ/ビュー モデルを示すマイクロソフトのチュートリアルが見つからないのはなぜですか?

-2 つのテーブル間で基本的な 1 対 1 の関係を作ろうとしていました。モデルでは、まず、テーブルの 1 つで FK を使用するのではなく、各テーブルの ID キーを同じフィールドに設定する必要があります。3 つ以上のテーブルが 1 対 1 の関係で互いにリンクされている場合、少し混乱する可能性があります。 . コードで最初にこれを回避する方法は、モデルビルダーを使用して手動で設定することです。MF では、私がまったくやりたくない XML に入ることで関係を変えることができると思います。

-コードファーストの問題に関するサポート/ヘルプの追加

Code First アプローチの使用を躊躇する理由は次のとおりです。

- 私は初心者のコーダーです。

-プロジェクトが拡大するにつれて、テーブルと関係を追跡することが非常に難しくなっていることがわかります。

-モデル図はありませんが、私はこのアイデアが本当に好きだと言わざるを得ません.

-構成クラスを介してエンティティをデータベースにマッピングすることは不可能だと思います:)。

- テーブルを更新するには、コードと DB を変更する必要があります。モデルでは、DB とコードを自動的に更新するモデルを最初に 1 つだけ変更します。バディ クラスを使用している場合は、これらも更新する必要があるかもしれません。

また、Code First にデータベースを生成させるのではなく、手動でデータベースを作成し、コード ファースト API を使用して EF にアクセスするという点で、Code First と Database first のアプローチを組み合わせている人もいます。

私の頭は、すべてのオプションと欠点、長所と短所でぐるぐる回っています。私は自分のウェブサイトの作成を続けたいだけで、どのアプローチをとるべきかを考えません. 私が言ったこと、および/または将来より主流になると彼らが考えていることに基づいて、どのアプローチが最適だと思うかについて、誰かが私に洞察を与えることができますか?

どうもありがとうデイブ

4

4 に答える 4

37

これは長すぎる質問です。次回は、問題を複数の個別の質問に分割する必要があります。

コードファースト×モデルファースト×データベースファースト

あなたはデータベースの専門家なので、DB (または VS データベース ツール) で定義し、データベースからモデルを更新するインクリメンタル データベース ファーストのアプローチが最適です。これにより、データベースを大幅に制御できるようになり、アプリケーションと DB を段階的に構築できるようになります。気に入っていただける理由:

  • あなたは以前に SQL DB 管理を行っていました - おそらく DB とパフォーマンスのためにそれらを設計する方法について何か知っているでしょう - EF はこれからあなたのために何もしません。EF はインデックスを作成しません。
  • 30 ~ 40 台のテーブルは、1 回の撮影でモデルを構築できないことを意味します。小さなモデルから始めて、継続的に成長させます。DB に変更を加えたり、初期化データを追加したりすると、これらの変更やデータを失いたくないでしょう。Code-first では、データベース全体を削除して最初から再作成することしかできません。モデル ファーストでは DB を段階的に構築できますが、Entity Designer Database Generation Power packと VS 2010 Premium または Ultimate ($5.000-$10.000) が必要です。

DB ファースト、モデル ファースト、コード ファーストの違いの詳細。別の回答では、コードファーストとデザイナーでの作業の違いについて説明しています。

DbContext API + データベース ファースト + Fluent マッピング

私はこれを最も困難な方法と呼んでいます。最初にデータベースを定義し、DbContext fluent API またはデータ注釈を使用してマッピングを定義します。これには、EF と、マッピングの背後にあるすべての原則を十分に理解していることと、DbContext API で使用される既定の規則を理解していることが必要です。これにより、マッピングを適切かつ明示的に制御できますが、最も手間がかかります。それは間違いなく最も難しい方法です。また、DbContext API は主にコード ファースト アプローチ用に作成されているため、想定された使用法ではありません。

DbContext API x ObjectContext API

EDMX (エンティティ デザイナー) の使用を開始すると、DbContext Generator T4 テンプレートまたは POCO Generator T4 テンプレートのいずれかを使用する選択肢があります。決定はあなた次第です。DbContext API (最初のテンプレート) または ObjectContext API (2 番目のテンプレート) のいずれかを使用できます。どちらのほうが文書化されており、次の 2 つの優れた本も使用できます。

ObjectContext API について私が知っているのは、これらの本、著者のブログ、および練習 + Reflector からです。

DbContext API には現在書籍がありません。いくつかの主要なサイトをチェックして、それに関する情報を入手できます。

DbContext API について私が知っているのは、これらのブログと実践 + Reflector だけです。

最初にコードを使用している場合でも、クラス ダイアグラムを使用してクラス ダイアグラムを視覚化できます (EDMX とは異なりますが、全体像を把握するには十分です)。

Stack Overflow またはMSDN フォーラムで検索すると、両方の API で発生するほとんどの問題について回答が得られます。

MVC3

MVC 3 でエンティティ フレームワークを使用することに固有のものはありません。データ検証アノテーションのバディ クラスは、悪い習慣と見なされます。バディ クラスは、エンティティに適用されるメタデータ ホルダーとして使用される別のクラスです。ビュー モデルは、コントローラーとビューの間でデータを転送するために使用されるクラスです。ビューモデルは、独自の検証注釈を使用してビューごとに固有である必要があります。これは、通常、同じエンティティ タイプを操作する場合、アプリケーションのさまざまな画面で異なる検証が必要になるためです。たとえば、編集画面と挿入画面では、検証要件が異なる場合があります。

良い習慣とは見なされていませんが、エンティティに検証を追加することは可能です。エンティティごとにバディ クラスを手動で作成するか、T4 テンプレートを変更して直接アノテーションを生成することができます (これは難しい)。 .

1対1の関係

はい、EF では、主キーの上にのみ 1 対 1 の関係を作成する必要があります。その理由は、EF が一意のキー/制約をサポートしていないためです。これを回避する方法はなく、データベースで一意のキーを使用しても変更されません。

于 2011-04-27T07:16:50.390 に答える
8

比較的単純です。データベース モデルを気にしない場合は、最初にコードを使用してください。その場合は、Model first (または Database First) を使用します。焦点がどこにあるか、データ中心かコード中心かによって異なります。

于 2011-04-26T22:41:51.063 に答える
3

私は両方のアプローチを見てきましたが、デザイナーのシンプルさが好きで、モデル全体を目の前で見るのが好きなため、Entity Model アプローチを好みます。これは、1 つのスナップショットで全体像を示します。また、私は強力なプログラマーではありませんが、DbContext ジェネレーター テンプレートを使用して POCO を生成し、クラス間のすべてのリンクを行う方法に感銘を受けました。

+

構成クラスを介してエンティティをデータベースにマッピングすることは不可能だと思います:)。

=最初にモデルを使用

バディ クラスを作成するのが良い方法である場合、MVC 3 についてこれを示す多くのチュートリアルが見つからないのはなぜですか? Buddy Classes は View Models の別名ですか? また、MVC 3 で使用されているこれらのバディ/ビュー モデルを示すマイクロソフトのチュートリアルが見つからないのはなぜですか?

これは、コード ファーストがブロックの新しい子供のようなものだからかもしれません。そのため、MVC3 のコード ファーストのチュートリアルがほとんどです。モデルファーストは「はるかに」古く、MVC2 の時代にはおそらく最も好まれたソリューションでした。

ところで:あなたは、あなたが最も好きなもの、または最も快適なものを使用すべきであるという私の意見をすでに知っています(前回あなたがこれについて尋ねたときに言ったように)が、ここに何かを追加したかっただけです:)

コメントの後に編集:

これらのことを見てください。これは、最初にコードを作成するのに非常に役立ちます。

ASP.NET MVC アプリケーション用の Entity Framework データ モデルの作成 (1/10) MvcScaffolding パッケージを使用して ASP.NET MVC 3 プロジェクトをスキャフォールディングする

++ チャンネル 9 の MIX11 からのこれらの素晴らしいビデオ: Scott Hanselmanは、MvcScaffolding のパワーを示す通常の Steve Sanderson
と同様に、彼の素晴らしい方法で新しいものを示しています

于 2011-04-26T22:47:44.943 に答える
0

モデル ファーストの主な問題である場合は、MVC の任意のバージョンのモデル ファーストの例を使用できます。MVC が「モデル」を処理する方法は、バージョン間で実際には異なりません。確かに、ビュー モデルなどには機能強化がありますが、古いチュートリアルで問題ないはずです。

データベース モデルとドメイン モデルがあり、それぞれ異なる目的を果たしていると感じているので、コードを優先します。データベース編成は、データベースのパフォーマンスとサイズのためであり、アプリケーションを支援するためのものではありません。独自のモデルを使用すると、データベースに関係なく、アプリケーションの状態のニーズに集中できます。

さて、最初にモデルからこのモデルにたどり着くことができますが、この方法では必要以上にデータベースについて考える可能性が高くなります... 特に. あなたがこれで初心者なら。

ちょうど私の2セント。

于 2011-04-26T22:45:42.657 に答える