Al crear una base de datos utilizando el código de Entity Framework primero, se puede extraer una gran parte del modelo de base de datos del código. Se pueden usar API fluidas y / o atributos para ajustar el modelo.
¿Cuáles son las ventajas y desventajas de Fluent Api en comparación con las anotaciones de datos? En otras palabras: incluso si en determinadas situaciones se pueden utilizar ambos métodos, ¿en qué casos debería prevalecer un método sobre el otro?
Respuestas:
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í ):
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.
fuente
[Required]
atributo en una propiedad en una aplicación ASP.NET MVC, EF y MVC lo usarán con fines de validación porque ambos pueden procesar este atributo. Pero MVC no comprenderá la configuración de la API Fluent. Entonces, si elimina el atributo y lo usaHasRequired
en Fluent API en su lugar, para EF será lo mismo pero no para MVC. (En mi opinión, los atributos deberían haber sido nombrados de manera diferente, el uso del espacio de nombres DataAnnotations de diferentes componentes y para diferentes propósitos es muy confuso).[DefaultValue()]
cuenta que tampoco es posible en Fluent Either.Fluent API
que mantendría tu lógica de implementación en tuDbContext
y mantendría tuPOCO
s limpia