En Entity Framework, las entidades son la representación de los objetos de negocio que se mapean a tablas en una base de datos relacional.
Es decir, una entidad es una clase de C# que va a tener una representación en una tabla en la base de datos. Cada instancia de esta clase corresponderá a una fila en la tabla.
Por su parte, las entidades están compuestas por propiedades, que corresponden a las columnas de las tablas.
Características de las entidades
- Clases simples: Las entidades son clases simples de C# (no dependen de ninguna clase base específica de Entity Framework)
- Propiedades: Las propiedades de la clase representan las columnas de la tabla
- Relaciones: Tienen relaciones con otras entidades, lo que permite modelar estructuras de datos complejas
Las entidades y sus propiedades son la base del modelado de datos en Entity Framework, y son las que nos permiten trabajar con los datos en forma de objeto de objetos, en lugar de manipular directamente las tablas de la base de datos.
Definición de una entidad
Para definir una entidad, simplemente creamos una clase en C#. Por ejemplo, supongamos que queremos modelar una tabla Productos
en nuestra base de datos.
La entidad correspondiente podría verse así:
public class Producto
{
public int Id { get; set; }
public string Nombre { get; set; }
public decimal Precio { get; set; }
public int Stock { get; set; }
}
En este ejemplo,
- La clase
Producto
representa la tablaProductos
. - Cada propiedad de la clase (
Id
,Nombre
,Precio
,Stock
) corresponde a una columna en la tabla.
Propiedades de una Entidad
Las propiedades de una entidad representan las columnas de la tabla. Cada propiedad tiene un tipo de dato que determina el tipo de columna en la base de datos.
EF Core intentará mapear automáticamente las propiedades de las clases de entidad a los tipos de datos adecuados en la base de datos, basándose en el tipo de la propiedad en C#.
Así, tenemos dos tipos principales de propiedades en Entity Framework.
- Propiedades escalares: Representan valores simples como
int
,string
,decimal
,DateTime
, etc. - Propiedades de navegación: Representan relaciones entre entidades.
Contienen la información y datos “básicos”. EF Core mapea estos tipos de datos de forma automática.
public class Producto
{
public int Id { get; set; }
public string Nombre { get; set; }
public decimal Precio { get; set; }
public DateTime FechaCreacion { get; set; }
}
En este ejemplo, Id
, Nombre
, Precio
y FechaCreacion
son propiedades escalares que se mapean a columnas en la tabla Productos
.
Algunos tipos básicos de datos comunes en EF Core incluyen:
int
->INT
string
->VARCHAR
DateTime
->DATETIME
bool
->BIT
Aunque ya veremos que podemos personalizar este comportamiento.
Estas propiedades no se mapean directamente a columnas en la tabla, sino que permiten acceder a entidades relacionadas.
Por ejemplo, supongamos que tenemos una entidad Categoria
y queremos relacionarla con Producto
:
public class Producto
{
public int Id { get; set; }
public string Nombre { get; set; }
public decimal Precio { get; set; }
public int CategoriaId { get; set; } // Clave foránea
public Categoria Categoria { get; set; } // Propiedad de navegación
}
public class Categoria
{
public int Id { get; set; }
public string Nombre { get; set; }
public ICollection<Producto> Productos { get; set; } // Propiedad de navegación
}
En este caso, Categoria
es una propiedad de navegación que permite acceder a la categoría a la que pertenece un producto. Del mismo modo, Productos
en la clase Categoria
es una propiedad de navegación que permite acceder a todos los productos de una categoría.
Configuración de entidades
Las entidades tienen que ser configuradas para poder usarlo. Por defecto, Entity Framework utiliza unas convenciones de nombre.
Por otro lado, en ocasiones necesitaremos cambiar o afinar, esta configuración. Entonces tendemos dos métodos principales, data annotations y el fluent API.
- Convenciones de nombres, configuración implícita (basada en reglas predefinidas)
- Data Annotations, configuración explícita usando atributos
- Fluent API, configuración explícita usando funciones
Cada una de estas aproximaciones tiene sus ventajas y desventajas
Método | Ventajas | Desventajas |
---|---|---|
Convenciones | ✅ Sencillo | ❌ Poco control sobre el mapeo |
Data Annotations | ✅ Puede ser más legible ✅ Bueno para validaciones | ❌ “Ensucia” las clases con atributos ❌ Limitado para relaciones complejas |
Fluent API | ✅ Máximo control sobre el mapeo ✅ Configuración centralizada | ❌ Curva de aprendizaje más alta |
En general,
- Usa convenciones de nombres cuando sean suficientes.
- Si no lo son:
- Usa Data Annotations para configuraciones simples (nombres, tipos básicos)
- Prefiere Fluent API para Configuraciones complejas de relaciones
Evita mezclar ambos enfoques para la misma entidad (puede causar conflictos)