web-dev-qa-db-fra.com

Entity Framework Code First - Avantages et inconvénients de Fluent Api vs Data Annotations

Lors de la création d'une base de données à l'aide du code Entity Framework en premier, une grande partie du modèle de base de données peut être extraite du code. Une API et/ou des attributs fluides peuvent être utilisés pour affiner le modèle.

Quels sont les avantages et les inconvénients de Fluent Api par rapport aux annotations de données? En d'autres termes: même si dans certaines situations les deux méthodes peuvent être utilisées, dans quels cas une méthode doit-elle prévaloir sur l'autre?

104
Sam

Tout ce que vous pouvez configurer avec DataAnnotations est également possible avec l'API Fluent. L'inverse n'est pas vrai. Ainsi, du point de vue des options de configuration et de la flexibilité, l'API Fluent est "meilleure".

Exemples de configuration (certainement pas une liste complète) qui sont possibles dans l'API Fluent mais pas avec DataAnnotations (pour autant que je puisse voir):

  • Désactivez les suppressions en cascade:

    .WillCascadeOnDelete(false)

  • Spécifiez le nom de la colonne de clé étrangère dans la base de données lorsque la clé n'est pas exposée dans votre modèle d'objet:

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

  • Réglage fin et précis des relations, en particulier dans tous les cas où un seul côté d'une association est exposé dans le modèle objet:

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

  • Spécification du mappage d'héritage entre le modèle d'objet et les tables de base de données (table par hiérarchie, table par type, table par classe concrète):

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

Edit: Microsoft considère l'API Fluent comme une "fonctionnalité avancée" (Citation de ici ):

L'API courante est considérée comme une fonctionnalité plus avancée et nous vous recommandons d'utiliser les annotations de données, sauf si vos besoins vous obligent à utiliser l'API courante.

Mais à mon avis, vous atteignez très rapidement les limites de DataAnnotations (sauf peut-être pour les modèles d'objet extrêmement simples). Si vous ne pouvez plus affiner votre modèle avec DataAnnotations, votre dernier recours est de suivre les conventions de mappage par défaut (en nommant vos propriétés selon ces règles). Actuellement, vous ne pouvez pas remplacer les conventions (désactivez-les uniquement; MS a annoncé qu'il donnerait des options de configuration pour les conventions dans les futures versions d'EF). Mais si vous ne voulez pas être forcé par les conventions de mappage lorsque vous définissez votre modèle d'objet, votre seule option est alors l'API Fluent.

L'apprentissage de l'API Fluent est presque un must, les DataAnnotations sont un atout pour les applications simples.

131
Slauma