コード優先vsモデル/データベース優先[終了]


618

Entity Framework 4.1をモデル/データベース優先でEDMXダイアグラムよりコードファーストで使用する場合の長所と短所は何ですか?

EF 4.1を使用してデータアクセスレイヤーを構築するためのすべてのアプローチを完全に理解しようとしています。リポジトリパターンとを使用していますIoC

コードファーストアプローチを使用できることを知っModelBuilderています。エンティティとコンテキストを手動で定義し、スキーマを微調整するために使用します。

EDMX図を作成し、T4テンプレートを使用して同じPOCOクラスを生成するコード生成ステップを選択することもできます。

どちらの場合も、私POCOORM不可知論的であり、から派生するコンテキストを持つオブジェクトになりますDbContext

Enterprise Managerでデータベースを設計し、モデルをすばやく同期し、デザイナーを使用して微調整できるので、データベースファーストが最も魅力的なようです。

では、これら2つのアプローチの違いは何ですか?それは単にVS2010対Enterprise Managerの好みについてですか?


12
Entity Framework 7はEDMXをドロップします:msdn.microsoft.com/en-us/magazine/dn890367.aspx
CADが

5
@CADbloke Entity Framework 7がEntity Framework Core 1.0になりました
RBT

6
他のブラウザに、あなたは7000個の長いXMLファイルのhardonと前述の、でマージの競合を解決しない限り、最初に行くのコード頭痛、自分のセーブ
ダン・パントリー

3
良い2015年1月のライトアップの3つのアプローチでありますroland.kierkels.net/c-asp-net/...
ゼブラ

4
与えられたほぼすべての答えは「私は考える」 ...「主に意見に基づく」の絶対的な定義です。
Lankymart 2018

回答:


703

違いは次のとおりだと思います。

最初にコード

  • 筋金入りのプログラマーはどんなデザイナーも好きではなく、EDMX xmlでマッピングを定義するのは複雑すぎるため、非常に人気があります。
  • コードの完全な制御(変更が難しい自動生成コードはありません)。
  • 一般的な期待は、DBを気にしないことです。DBはロジックのない単なるストレージです。EFは作成を処理しますが、それがどのように機能するかを知りたくありません。
  • コードがデータベースを定義しているため、データベースへの手動の変更はおそらく失われます。

最初にデータベース

  • DBAによって設計され、個別に開発されたDBがある場合、または既存のDBがある場合は、非常に人気があります。
  • EFにエンティティを作成させ、マッピングの変更後、POCOエンティティを生成します。
  • POCOエンティティに追加機能が必要な場合は、T4テンプレートを変更するか、部分クラスを使用する必要があります。
  • データベースがドメインモデルを定義しているため、データベースを手動で変更することが可能です。データベースからいつでもモデルを更新できます(この機能は非常にうまく機能します)。
  • 私はこれをVS Databaseプロジェクトと一緒によく使用します(PremiumバージョンとUltimateバージョンのみ)。

最初のモデル

  • あなたがデザイナーのファンなら、私見は人気です(=コードやSQLを書くのが嫌いです)。
  • モデルを「描画」して、ワークフローでデータベーススクリプトを生成し、T4テンプレートでPOCOエンティティを生成します。エンティティとデータベースの両方のコントロールの一部を失うことになりますが、小さな簡単なプロジェクトの場合は非常に生産的です。
  • POCOエンティティに追加機能が必要な場合は、T4テンプレートを変更するか、部分クラスを使用する必要があります。
  • モデルがデータベースを定義しているため、データベースへの手動の変更はおそらく失われます。データベース生成パワーパックがインストールされている場合、これはよりうまく機能します。(再作成する代わりに)データベーススキーマを更新したり、VSでデータベースプロジェクトを更新したりできます。

EF 4.1の場合、コードファーストとモデル/データベースファーストに関連する他の機能がいくつかあると思います。最初にコードで使用されるFluent APIは、EDMXのすべての機能を提供するわけではありません。ストアドプロシージャのマッピング、クエリビュー、ビューの定義などの機能は、モデル/データベースを最初に使用したときに機能し、DbContext(まだ試していませんが)コードでは最初は機能しないと思います。


5
@Ladislav-包括的な答えをありがとう。明確にするために:流暢なAPIのいくつかの制限を除いて、これらのアプローチの間に実際の技術的な違いはありませんか?それは開発/導入プロセス/方法論に関するものですか?たとえば、Dev / Test / Beta / Prodの個別の環境があり、スキーマを変更すると複雑なデータの変更が必要になる場合があるため、Beta / Prodでデータベースを手動でアップグレードします。Dev / Testを使用すると、EFがデータベースをドロップして作成できるので、イニシャライザに自分でテストデータをシードできるので、うれしいです。
Jakub Konecki

152
私は長い間データベースを設計してきましたが、最初にデータベース以外のことをするなんて想像もできません。実際、私はまだより大量のselectステートメントなどのために多くのストアドプロシージャを記述し、パフォーマンスの名の下にEFモデルに関数をインポートします。
Steve Wortham

9
大量のselectステートメントとはどういう意味ですか?ストアドプロシージャは、アプリケーションからSELECTが送信するよりも高速ではありません。
Piotr Perak 2012年

20
アプリケーションにSQLを含めることができます。そのSQLはコンパイルされたコードに埋め込まれている可能性が高く、ストアドプロシージャの変更はストアドプロシージャの編集のみを必要としますが、変更は再コンパイルと再配置を必要とします。この場合の変更による顧客/クライアント/ユーザーへの影響は少なくなります。
CodeWarrior

5
@JakubKonecki、DbContext存在しないものが何でも存在する場合は、ObjectContext単にuseを使用してください((IObjectContextAdapter)dbcontext).ObjectContext
Shimmy Weitzhandler

134

「Programming Entity Framework」の作者であるJulie Lermanによるこの単純な「決定木」は、より自信を持って決定を下すのに役立つと思います。

EFでのさまざまなアプローチの選択に役立つ決定木

詳細はこちら


111
これは完全ではありません。ビジュアルデザイナーを使用したくないが、既存のデータベースがある場合はどうなりますか?
デイブニュー

14
さらに悪いことに...コードファーストを使用するときに直面する技術的な制限ではなく、ダイアグラムによって実際の決定が行われません。たとえば、フィールドに一意のインデックスを作成できない、またはツリーテーブルの階層データを削除できないcontext.Table.SqlQuery( "select ...")を使用したCTEが必要です。最初にモデル/データベースにはこれらの欠点はありません。
エリザベス

32
@davenewzaそれが最初の道ですね。
Chris S

3
@davenewza既存のデータベース=>既存のクラス?コードファースト:データベースファースト:)
riadh gomri 2013

4
@davenewzaエンティティフレームワークPowertoolsを使用して、DBからPOCOクラスを作成します。既存のデータベースへのコードファースト
Iman Mahmoudinasab 2014年

50

最初のデータベースと最初のモデルには実際の違いはありません。生成されたコードは同じであり、このアプローチを組み合わせることができます。たとえば、SQLスクリプトを使用してデータベースを変更し、モデルを更新するよりも、デザイナーを使用してデータベースを作成できます。

最初にコードを使用する場合、データベースを再作成してすべてのデータを失うことなくモデルを変更することはできません。私見、この制限は非常に厳しく、最初に本番環境でコードを使用することはできません。今のところ、それは本当に使えません。

最初のコードの2番目のマイナーな欠点は、モデルビルダーがマスターデータベースに対する権限を必要とすることです。これは、SQL Server Compactデータベースを使用している場合、またはデータベースサーバーを制御している場合には影響しません。

最初のコードの利点は、非常にクリーンでシンプルなコードです。このコードを完全に制御でき、簡単に変更してビューモデルとして使用できます。

バージョン管理なしでシンプルなスタンドアロンアプリケーションを作成し、本番環境での変更が必要なプロジェクトで最初にmodel \ databaseを使用する場合は、コードファーストアプローチを使用することをお勧めします。


7
SQLスクリプトを使用して運用環境を手動で更新する場合は、Code Firstでも同じことができます。必要に応じて、変更スクリプトを生成するだけです。いくつかのツールでこれらのデルタを自動化でき、Code Firstを使い続けることができます。現在のデータベースを削除しないように、Code FirstイニシャライザをCreateDatabaseIfNotExistsのようなものに変更するだけです。
Esteban Brenes、2012

いくつかの違いは、ビューをインポートしてから、ビューがテーブルになるデータベースを再生成することです。新しいDBを生成し、prod DBと比較して同期しているかどうかを確認するのが難しくなります。
デイブ

Model Firstはユーザー定義のSQL関数をサポートしていません(少なくともEF4では、これが変更されたかどうかはわかりません)。Database Firstでは、UDFをインポートして、LINQクエリで使用できます。
Tsahi Asher 2014

違いはありませんか?ビューとSimpleMembershipテーブルをインポートしてから、モデルからデータベースを生成して、何が得られるかを確認してください。程遠い!これらは往復するはずですが、MSFTは基本的にCFの代わりにMFとDFを放棄しましたが、これはビューとストアドプロシージャの使用に関しても不完全です。
Dave

コードファーストマイグレーションベースのデータベース再作成プロセスを無効にして、モデルとデータベースで手動で実行できます。これを行うには、<EntityFramework> ..... <contexts> <context type = "myNamespace.mydbContext"、 "myassemblyORProject" disableDatabaseInitialization = "true" />のweb / app.configでdisableDatabaseInitialization = "true"を指定します。 </ EntityFramework> migrationsフォルダーを削除できます。
Hasteq 2016年

37

http://www.itworld.com/development/405005/3-reasons-use-code-first-design-entity-frameworkから関連部品を引用

Entity Frameworkでコードファーストデザインを使用する3つの理由

1)破片が少なく、膨らみが少ない

既存のデータベースを使用して.edmxモデルファイルと関連するコードモデルを生成すると、自動生成されたコードの膨大な山ができます。何かを壊したり、変更が次世代で上書きされたりしないように、これらの生成されたファイルには絶対に触れないようにしてください。コンテキストとイニシャライザは、この混乱でも一緒に詰まっています。計算された読み取り専用プロパティのように、生成されたモデルに機能を追加する必要がある場合は、モデルクラスを拡張する必要があります。これは、ほとんどすべてのモデルの要件となり、すべての拡張機能を使用することになります。

最初にコードを使用すると、手動でコード化したモデルがデータベースになります。構築している正確なファイルは、データベース設計を生成するものです。追加のファイルはなく、プロパティなど、データベースが認識する必要のないものを追加するときに、クラス拡張を作成する必要はありません。適切な構文に従う限り、それらを同じクラスに追加できます。必要に応じて、Model.edmxファイルを生成してコードを視覚化することもできます。

2)より優れた制御

最初にDBに移行するとき、アプリケーションで使用するためにモデルに対して生成されるものに翻弄されます。時々、命名規則が望ましくない場合があります。時々、関係や関連性があなたの望むものではない場合があります。また、API応答に遅延読み込みを伴う一時的でない関係が発生することもあります。

ほとんどの場合、発生する可能性のあるモデル生成の問題の解決策はありますが、最初にコードを実行すると、最初から完全で細かい制御ができます。ビジネスオブジェクトの快適さから、コードモデルとデータベース設計の両方のあらゆる側面を制御できます。関係、制約、および関連付けを正確に指定できます。プロパティの文字制限とデータベースの列サイズを同時に設定できます。どの関連コレクションを積極的にロードするか、まったくシリアル化しないかを指定できます。要するに、あなたはより多くのものに責任がありますが、あなたはあなたのアプリデザインを完全に制御しています。

3)データベースのバージョン管理

これは大きな問題です。データベースのバージョン管理は難しいですが、コードファーストとコードファーストの移行により、はるかに効果的です。データベーススキーマは完全にコードモデルに基づいているため、ソースコードをバージョン管理することで、データベースのバージョン管理に役立ちます。固定ビジネスデータのシードなどを行うのに役立つコンテキストの初期化を制御する必要があります。また、コードファーストマイグレーションの作成も担当します。

初めて移行を有効にすると、構成クラスと初期移行が生成されます。最初の移行は、現在のスキーマまたはベースラインv1.0です。その時点から、バージョンの順序付けに役立つように、タイムスタンプが付けられ、記述子でラベル付けされたマイグレーションを追加します。パッケージマネージャーからadd-migrationを呼び出すと、UP()関数とDOWN()関数の両方でコードモデルで自動的に変更されたすべてを含む新しい移行ファイルが生成されます。UP関数はデータベースに変更を適用し、DOWN関数はロールバックするイベントで同じ変更を削除します。さらに、これらの移行ファイルを編集して、新しいビュー、インデックス、ストアドプロシージャなど、その他の変更を追加できます。これらは、データベーススキーマの真のバージョン管理システムになります。


31

コードファーストは新星のようです。Ruby on Railsをざっと見てみたところ、Ruby on Railsの標準はデータベースを移行するコードファーストです。

MVC3アプリケーションを構築している場合、コードには最初に次の利点があると思います。

  • 簡単な属性の装飾 -フィールドを検証、要求などの属性で装飾できます。EFモデリングでは扱いにくいです
  • 奇妙なモデリングエラーなしは奇妙なエラーがよくあります。たとえば、関連付けプロパティの名前を変更しようとすると、基になるメタデータと一致する必要があるため、非常に柔軟性が。
  • マージする厄介ではない -など水銀などのコードのバージョン管理ツールを使用する場合は、.edmxファイルをマージすることは苦痛です。あなたはC#に慣れているプログラマーであり、そこで.edmxをマージしています。コードファーストではそうではありません。
  • 最初にコードと比較すると、複雑な問題や不明な点をすべて処理することなく、完全に制御できます。
  • パッケージマネージャーのコマンドラインツールを使用することをお勧めします。グラフィカルツールを使用して、新しいコントローラーを足場ビューに追加しないでください。
  • DB移行 -次に、移行を有効にすることもできます。これはとても強力です。コードでモデルに変更を加えると、フレームワークでスキーマの変更を追跡できるため、スキーマバージョンが自動的にアップグレード(および必要に応じてダウングレード)されたアップグレードをシームレスにデプロイできます。(わかりませんが、これはおそらくモデルファーストでも機能します)

更新

この質問では、code-firstとEDMXモデル/ db-firstの比較も求められます。コードファーストは、これらの両方のアプローチにも使用できます。


3
Model-firstはPOCOを最初にコーディングしていません。これはコードファーストです。Model-FirstはPOCOを自動生成し、その後モデルからデータベースを生成するビジュアルデザイナーです。
ディエゴメンデス

最近、ビジュアルルートとコードルートの両方で、最初に「モデル」または「データベース」を実行できます。1つ目は手動の設計(コードまたはビジュアルエディターによる)、2つ目はデータベースの構築とモデルの作成(POCOまたはEDMX)です。
2016

11

データベース構成をより柔軟に制御するために、最初にEFデータベースを使用します。

最初にEFコードとモデルが最初はクールに見え、データベースの独立性を提供しますが、これを行うと、非常に基本的で一般的なデータベース構成情報と見なすものを指定できません。たとえば、テーブルインデックス、セキュリティメタデータ、または複数の列を含む主キーがあります。これらの一般的なデータベース機能を使用したいので、データベース構成を直接行う必要があります。

最初にDB中に生成されたデフォルトのPOCOクラスは非常にクリーンですが、非常に有用なデータアノテーション属性、またはストアドプロシージャへのマッピングが不足しています。これらの制限のいくつかを克服するためにT4テンプレートを使用しました。T4テンプレートは、特に独自のメタデータや部分クラスと組み合わせると素晴らしいです。

最初にモデルには多くの可能性があるようですが、複雑なデータベーススキーマのリファクタリング中に多くのバグを私に与えています。なぜだかわかりません。


4
あなたはできる最初のコードを使用して複合キーを定義する- stackoverflow.com/questions/5466374/...
ヤクブKonecki

3
将来の読者のために、これはもう当てはまりません。EFCode Firstで、インデックス、複数列の主キーなどを追加できます。
tobiak777 2015

1
3つのアプローチすべてに長所と短所があるので、3つのアプローチすべてが同じデータベースで交換可能に使用できるようにEFが修正されているはずです
Dave

さらに、将来的に他のIDE /言語への移行のためにデータベースを最初に使用している理想的ではないコードファーストソリューションの真実と、データベース構造を統合して統合したいと考えています。データストレージ。
QMasterは2016

7

大きなモデルでの作業は、SP1以前は非常に遅くなりました(SP1以降は試していませんが、今は簡単だと言われています)。

私はまだ最初に自分のテーブルを設計し、次に社内で構築されたツールがPOCOを生成するので、各pocoオブジェクトに対して反復的なタスクを実行する負担がかかります。

ソース管理システムを使用している場合、POCOの履歴を簡単にたどることができます。デザイナーが生成したコードではそれほど簡単ではありません。

POCOのベースがあるので、多くのことが非常に簡単になります。

私はすべてのテーブルのビューを持っています。各ベースビューは外部キーの基本情報を持ち、ビューのPOCOはPOCOクラスから派生します。これは非常に便利です。

そして最後に私はデザイナーが好きではありません。


8
「ソース管理システムを使用している場合、POCOの履歴を簡単にたどることができますが、デザイナーが生成したコードではそれほど簡単ではありません。」-デザイナーが生成したコードをソース管理に保持しているため、いつでも履歴を表示できます。
Jakub Konecki

1
@JakubKonecki 3人以上のチームでEDMXファイルを結合しようとしたことがありますか?それはただの痛みです...代わりに、人々はマージを避け、他のリビジョンを取り、独自の変更を繰り返すようにします。なぜなら、マージは数千行のXMLで自動生成されたファイルで失敗する傾向があるためです。
bytecode77

6

データベースの最初のアプローチの例:

コードを記述せずに: ASP.NET MVC / MVC3データベースファーストアプローチ/データベースファースト

また、このアプローチではデータ損失が少ないため、他のアプローチよりも優れていると思います。


DBファーストのアプローチで「データ損失が少ない」ことについて詳しく教えてください。既存のテーブルを2つに分割する場合、データ変換をどのように実行しますか?
Jakub Konecki

おそらく、変換を処理するSQLスクリプトを作成することになります。一般に、MSは新しいバージョンでコードファーストデータの移行を改善することを発表したため、これは将来の議論にならないかもしれません。
ckonig 2012年

最初のデータベースの問題は、データベース設計には一般に、モデルに漏れる不完全な抽象化が含まれていることです...ジャンクションテーブルなど。データベースの仕事は、単にモデルを永続化することです。
Nerdfest 2014

この「答え」は、あなたの主張に根拠のない意見に基づいたものであり、1つの文はスタンスを構成しません。
TravisO 2017

DBファーストのアプローチで「データ損失が少ない」ことについて詳しく教えてください。
amal50

4

私見すべてのモデルは素晴らしい場所だと思いますが、モデルファーストアプローチで私が抱えている問題は、DBAがデータベースを制御している多くの大企業で、データベースファーストアプローチを使用せずにアプリケーションを構築する柔軟性を得られないことです。私は多くのプロジェクトに取り組んできましたが、デプロイメントに関しては、完全なコントロールが必要でした。

したがって、可能なすべてのバリエーションに最初に同意する限り、コードファースト、モデルファースト、データベースファースト、実際の本番環境を考慮する必要があります。したがって、システムが大規模なユーザーベースのアプリケーションで、多くのユーザーがいて、DBAがショーを実行している場合は、データベースの最初のオプションを私の意見だと考えるかもしれません。


あなたが正しいです。MSは、異なるシナリオであるため、プログラマに異なるアプローチを提供しました。すべてを把握し、シナリオに基づいてプロジェクトに最適なものを決定し、次に最も気に入ったものを決定する必要があります。
スターリングディアス

0

最初にコードの利点の1つは、Gitのようなバージョン管理システムに加えたすべての変更をバックアップできることです。すべてのテーブルとリレーションシップは、本質的には単なるクラスであるものに格納されているため、時間を遡って、データベースの構造を以前の状態に戻すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.