Todo lo que puede configurar con DataAnnotations también es posible con Fluent API. Lo opuesto no es verdad. Entonces, desde el punto de vista de las opciones de configuración y la flexibilidad, Fluent API es "mejor".
Ejemplos de configuración (seguro que no es una lista completa) que son posibles en la API Fluent pero no con DataAnnotations (por lo que puedo ver):
Desactivar eliminaciones en cascada:
.WillCascadeOnDelete(false)
Especifique el nombre de la columna de clave externa en la base de datos cuando la clave no esté expuesta en su modelo de objeto:
.Map(conf => conf.MapKey("MyForeignKeyID"))
Ajuste granular fino de las relaciones, especialmente en todos los casos en los que solo se expone un lado de una asociación en el modelo de objetos:
.WithMany(...)
, WithOptional(...)
, WithRequiredDependent(...)
,WithRequiredPrincipal(...)
Especificación del mapeo de herencia entre el modelo de objetos y las tablas de la base de datos (tabla por jerarquía, tabla por tipo, tabla por clase de concreto):
.Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)
Editar: Microsoft considera la API Fluent como una "característica avanzada" (cita de aquí ):
La API fluida se considera una función más avanzada y le recomendamos que utilice anotaciones de datos a menos que sus requisitos requieran que utilice la API fluida.
Pero en mi opinión, alcanza las limitaciones de DataAnnotations muy rápidamente (excepto quizás para modelos de objetos extremadamente simples). Si ya no puede ajustar su modelo con DataAnnotations, su último recurso es seguir las convenciones de mapeo predeterminadas (nombrando sus propiedades de acuerdo con esas reglas). Actualmente no puede sobrescribir las convenciones (solo deshabilítelas; MS anunció que ofrecerá opciones de configuración para las convenciones en futuras versiones de EF). Pero si no quiere verse obligado por las convenciones de mapeo cuando defina su modelo de objeto, su única opción es la API Fluent.
Aprender la API fluida es casi imprescindible, en mi humilde opinión, las anotaciones de datos son una buena opción para aplicaciones simples.