En este tutorial veremos las convenciones de nombres, reglas predeterminadas que el framework utiliza para mapear las clases de C# a las tablas de base de datos.
EF Core sigue un conjunto de convenciones para generar nombres de tablas, columnas, claves primarias y claves foráneas, que permiten a EF inferir la estructura de la base de datos.
Si seguimos estas convenciones, EF generará el esquema de la base de datos sin necesidad de configuración adicional (aunque luego podemos personalizad esta configuración).
Vamos a ver las principales de ellas,
Convención de nombres de tablas
Por defecto, EF Core utiliza el nombre de la clase para el nombre de la tabla en la base de datos.
Es decir, si tienes una clase en C# llamada Product
, EF Core generará automáticamente una tabla llamada Products
(en plural) en la base de datos.
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
Esto se mapeará en la base de datos a:
CREATE TABLE Products (
Id INT PRIMARY KEY,
Name NVARCHAR(MAX)
);
Convención de columnas
De manera predeterminada, EF Core utiliza el nombre de la propiedad de la clase como el nombre de la columna en la base de datos.
Por ejemplo, si la clase Estudiante
tiene una propiedad llamada Nombre
, EF Core generará una columna llamada Nombre
en la tabla correspondiente.
public class Estudiante
{
public int Id { get; set; }
public string Nombre { get; set; }
public int Edad { get; set; }
}
En este caso, EF creará las columnas Id
, Nombre
y Edad
en la tabla Estudiantes
.
- Los tipos se infieren del tipo de dato en C# (
string
→NVARCHAR
,int
→INT
, etc.).
Convención de claves primarias
EF Core tiene una convención para reconocer la clave primaria de cada entidad. Si una entidad tiene una propiedad llamada Id
o el nombre de la clase seguido de Id
Por ejemplo, si tenemos EstudianteId
para la clase Estudiante
, EF Core la usará como la clave primaria de la tabla.
public class Estudiante
{
public int EstudianteId { get; set; } // Convención para la clave primaria
public string Nombre { get; set; }
public int Edad { get; set; }
}
En este caso, EF Core reconocerá automáticamente la propiedad EstudianteId
como la clave primaria de la tabla Estudiantes
.
EF sigue estas reglas para identificar claves primarias:
- Una propiedad llamada
Id
o{NombreClase}Id
se considera clave primaria. - Si es de tipo
int
,Guid
, o similar, se configurará como autoincremental.
Convención de claves foráneas y relaciones
Cuando hay relaciones entre entidades, EF Core buscará una propiedad cuyo nombre sea el nombre de la entidad relacionada seguido de Id
.
Por ejemplo, si tienes una relación entre Estudiante
y Curso
, EF Core buscará una propiedad llamada CursoId
para representarla como la clave foránea.
public class Curso
{
public int CursoId { get; set; }
public string Nombre { get; set; }
public ICollection<Estudiante> Estudiantes { get; set; }
}
public class Estudiante
{
public int EstudianteId { get; set; }
public string Nombre { get; set; }
public int Edad { get; set; }
public int CursoId { get; set; } // Convención para la clave foránea
public Curso Curso { get; set; }
}
En este caso, EF Core reconocerá la propiedad CursoId
en la clase Estudiante
como la clave foránea que se relaciona con la tabla Cursos
.
Cómo personalizar o deshabilitar convenciones
Podemos modificar el comportamiento por defecto mediante Data Annotations o Fluent API (lo veremos en los próximos tutoriales).
Además, si necesitamos modificar el comportamiento predeterminado globalmente podemos agregar o modificar las convenciones de nombres.
protected override void ConfigureConventions(ModelConfigurationBuilder builder)
{
builder.Properties<string>()
.HaveMaxLength(100); // Todas las propiedades string tendrán máximo 100 caracteres
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Elimina la convención de pluralización
modelBuilder.Model.GetEntityTypes()
.ToList()
.ForEach(e => e.SetTableName(e.DisplayName()));
}