Entity Framework Code First-Fluent Apiとデータアノテーションのメリットとデメリット[終了]


118

Entity Frameworkをコードファーストで使用してデータベースを作成する場合、データベースモデルの多くをコードから抽出できます。Fluent APIや属性を使用して、モデルを微調整できます。

データアノテーションと比較したFluent Apiの長所と短所は何ですか?つまり、特定の状況で両方の方法を使用できる場合でも、どの方法で一方の方法が他方よりも優先されるのでしょうか。


3
ただのアイデア:私が通常行うことは、POCOを使用してモデルプロジェクトを作成し、次にリポジトリプロジェクトで、EF専用の新しいPOCOセットを作成し、そこに注釈を配置することです。次に、マッパークラスで2つをマッピングします。そうすれば、私のモデルはそのままで、必要に応じてデータ戦略の追加や変更が簡単になります(たとえば、XmlRepositoryを追加して、同じモデルクラスを使用します)。
adimauro 2011年

1
今では、EFCoreと追加のライブラリを備えたAnnotationを好みます。(必要なコードが少なく、すべてが1か所にあります)github.com/isukces/EfCore.Shaman-属性を追加および拡張しますgithub.com/borisdj/EFCore.FluentApiToAnnotation-リバースエンジニアリングを実行してからに切り替えた後、DBがすでに存在する場合に役立ちますCodeFirst
borisdj

回答:


140

DataAnnotationsで構成できるすべてのことは、Fluent APIでも可能です。逆は当てはまりません。そのため、構成オプションと柔軟性の観点から、Fluent APIは「優れています」。

Fluent APIで可能ですが(私が見る限り)DataAnnotationsでは不可能である構成例(確かに完全なリストではありません):

  • カスケード削除をオフにします。

    .WillCascadeOnDelete(false)

  • オブジェクトモデルでキーが公開されていない場合は、データベースに外部キー列名を指定します。

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • 関係の細かい調整、特に、関連付けの片側のみがオブジェクトモデルで公開されるすべての場合。

    .WithMany(...)WithOptional(...)WithRequiredDependent(...)WithRequiredPrincipal(...)

  • オブジェクトモデルとデータベーステーブルの間の継承マッピングの仕様(Table-Per-Hierarchy、Table-Per-Type、Table-Per-Concrete-Class):

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

編集:MicrosoftはFluent APIを「高度な機能」と見なしています(ここからの引用):

Fluent APIはより高度な機能と考えられており、Fluent APIを使用する必要がある場合を除き、データアノテーションを使用することをお勧めします。

しかし、私の意見では、DataAnnotationsの制限にすぐに到達します(おそらく非常に単純なオブジェクトモデルを除く)。DataAnnotationsを使用してモデルを微調整できない場合、最後の手段は、デフォルトのマッピング規則に従うことです(これらの規則に従ってプロパティに名前を付けることにより)。現在、規則を上書きすることはできません(無効にするだけです。MSは、今後のEFリリースで規則の構成オプションを提供することを発表しました)。ただし、オブジェクトモデルを定義するときにマッピング規則に強制されたくない場合、唯一の選択肢はFluent APIです。

Fluent APIを学ぶことはほぼ必見ですが、DataAnnotationsは単純なアプリケーションにとって便利です。


2
私はこの分野の初心者です。Fluent APIを使用して、DataAnnotationと同じようにユーザーインターフェイスを検証できますか?
脇の下にキス

26
@CounterTerrorist:そ​​うは思いません。例:[Required]ASP.NET MVCアプリケーションのプロパティに属性を配置する、EF MVCの両方がこの属性を処理できるため、検証目的で使用されます。しかし、MVCはFluent API構成を理解しません。したがって、属性を削除してHasRequired代わりにFluent APIで使用すると、EFの場合は同じになりますが、MVCの場合は異なります。(私の意見では、属性には異なる名前を付ける必要がありました。異なるコンポーネントからのDataAnnotations名前空間の使用は、異なる目的のために非常に混乱しています。)
Slauma

3
また[DefaultValue()]、Fluent Eitherでは使用できません。
webnoob 2014

3
MinValueは、Fluent API(プログラミングエンティティフレームワーク:コードファースト)を介して定義できない属性です(ソース:The Cogによって削除されたNAA )
Serge Ballesta 14

7
アーキテクチャの観点からはFluent API、実装ロジックDbContextを維持し、POCOクリーンな状態を維持すると思います
Luke T O'Brien
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.