13

Comparativa de Atributos vs. Fluent API en Entity Framework .NET

5598Puntos

hace 2 años

Entity framework (EF) es una de las librerías más utilizadas en el mundo de .NET y utiliza el concepto de ORM (object-relational mapping) para mapear los componentes de la base de datos en clases, objetos y propiedades; con las cuales podrás diseñar una base de datos desde el código y también la interacción de nuestra aplicación con la base de datos.

A pesar de que existen otros ORM dentro del ecosistema .NET como: Dapper y Nhibernate; Entity framework tiene el mayor mercado y ha venido mejorando en sus últimas versiones, especialmente en los aspectos de rendimiento y usabilidad.

En este artículo analizaremos 2 formas en las que podemos configurar los detalles de nuestra base de datos utilizando los modelos de clases en C#. Vamos a utilizar el siguiente modelo como referencia para realizar la comparación:

//Modelo de categoriapublicclassCategoria
{
    public Guid CategoriaId {get;set;}
    publicstring Nombre {get;set;}
    publicstring Descripcion {get;set;}

    publicvirtual ICollection<Tarea> Tareas {get;set;}
}

EF soporta atributos o DataAnnotations que nos permiten indicar sobre nuestros modelos qué propiedad representa la clave dentro de la base de datos, la clave foránea o por ejemplo el máximo de caracteres que puede tener un campo tipo texto.

Por otro lado, Fluent API ofrece una serie de funciones que pueden ser llamadas en cadena para especificar la configuración del mapeo que estamos realizando de nuestros modelos hacia la base de datos. Usar atributos o DataAnnotations es una manera más simple de poder configurar el esquema de nuestra base de datos, sin embargo, en algunos escenarios se puede quedar corto y también se dificulta la lectura, ya que debemos navegar a cada modelo para verificar su configuración.

Vamos a analizar algunos escenarios comunes cuando estamos configurando nuestra base de datos usando Entity framework y haremos una comparativa entre el funcionamiento de data annotations o atributos versus Fluent API.

Si queremos indicar que una propiedad representa la clave primaria dentro de nuestro modelo, podemos utilizar:

Atributo :

[Key]
public Guid CategoriaId {get;set;}

Fluent API:

categoria.HasKey(p=> p.CategoriaId);

Si queremos indicar que una propiedad de nuestro modelo es requerida, podemos utilizar:

Atributo :

[Required]
publicstring Nombre{get;set;}

Fluent API:

categoria.Property(p=> p.Nombre).IsRequired();

Para indicar el nombre de la tabla que va a representar nuestro modelo, podemos utilizar:

Atributo :

[Table]
publicclassCategoria

Fluent API:

categoria.ToTable("Categoria");

Para especificar el número de caracteres de una propiedad tipo texto, podemos utilizar:

Atributo :

[MaxLength(150)]
publicstring Nombre {get;set;}

Fluent API:

categoria.Property(p=> p.Nombre).HasMaxLength(150);

Para indicar que un campo es único en la base de datos utilizamos el siguiente atributo:

[Index(IsUnique = true)]
publicstring Nombre {get;set;}

Fluent API:

categoria.Property(p=> p.Nombre)..IsUnique();

si queremos excluir una de las propiedades del modelo al momento de crear la base de datos, podemos usar:

Atributo :

[NotMapped]
publicstring Descripcion {get;set;}

Fluent API:

categoria.Ignore(p=> p.Descripcion);

Podemos concluir que ambas formas de configurar nuestra base de datos utilizando Entity framework son bastante simples, sin embargo, es importante tratar de no combinar ambas formas y utilizar solo una en el diseño de nuestra aplicación.

Por otro lado, también es valioso resaltar que Fluent API tiene prioridad ante el diseño que tengamos hecho con data-annotation o atributos, ya que este va se ejecuta al momento de la creación del esquema de la base de datos. Es decir, después de analizar la estructura y configuración de los modelos.

Con este conocimiento que tenemos sobre las maneras de configurar Entity framework revisemos algunas buenas prácticas a tener en cuenta:

  • Utilizar para la clave primaria el nombre de la tabla más la palabra id.
  • Utilizar nombre singular para nombrar las tablas.
  • Especifica de manera estricta el número de caracteres que puede tener un campo texto.
  • Utiliza nombre en plural para las colecciones dbset dentro del contexto de Entity framework.
  • Utiliza para las claves foráneas el nombre de la tabla más la palabra id.

En la documentación oficial de Microsoft podemos encontrar otros tipos de data-annotations que podemos utilizar en otros escenarios, más avanzados.

Para Fluent API también se tiene una documentación muy completa que nos permite analizar otros posibles escenarios y configuraciones.

Puedes aprender más sobre como realizar la configuración completa de Fluent API con 2 tablas relacionadas, en el proyecto del Curso de Fundamentos de Entity Framework de Platzi. que ya está disponible.

Miguel
Miguel
Mteheran

5598Puntos

hace 2 años

Todas sus entradas
Escribe tu comentario
+ 2
3

Gracias por esta entrada al blog, en un proyecto opté por iniciarlo con Dapper, pero la verdad me había acostumbrado tanto a EF, que lo deje a un lado, por que tenia mucho código duro por asi decirlo y a veces repetitivo, será por que no soy experto en Dapper, pero EF me ha simplificado mi vida como desarrollador.

1
62Puntos
2 años

Dapper es una buena opcion cuando necesitas hacer consultas anidadas o con una complejidad mas avanzada que represente una carga de recursos dentro de la base de datos.
Una buena alternativa pienso podria ser usar las dos, EF para mapeo y definicion de esquemas y Dapper para consultas complejas.