Crear una entidad de dominio
Un módulo puede aportar sus propias tablas al contexto central de Crono (CronoDbContexto) sin crear una base de datos aparte. El flujo tiene tres piezas: la clase de entidad, su migración y el registro de la fuente de configuración del contexto.
1. La clase de entidad
Las entidades derivan de EntidadBase, que ya aporta el Id (entero, autoincremental) y el soporte de carga diferida. Una entidad sencilla de módulo se ve así:
public class Notificacion : EntidadBase
{
public int AutorId { get; set; }
public DateTime PublicadaUtc { get; set; }
public string Mensaje { get; set; }
}
Para catálogos con valores fijos, Crono ofrece además patrones especializados como EntidadConEnumeracion<T> (usado, por ejemplo, por el catálogo de tipos de documento SUNAT), que combina una entidad persistida con instancias predefinidas. Consulta Dominio para el modelo base completo.
2. La migración (FluentMigrator)
Crono versiona el esquema con FluentMigrator. Crea una migración con el atributo [MigracionVersion] (marca de tiempo + nombre) y define la tabla en Up():
using Crono.Nucleo.Datos.Migraciones;
using Crono.Nucleo.Datos.Migraciones.Constructores;
using FluentMigrator;
[MigracionVersion("2026-07-31 10:00:00", "NotificacionInicial")]
internal class NotificacionInicial : Migration
{
const string Tabla = nameof(Notificacion);
public override void Up()
{
if (!Schema.Table(Tabla).Exists())
{
Create.Table(Tabla)
.WithIdColumn()
.WithColumn(nameof(Notificacion.AutorId)).AsInt32().NotNullable()
.WithColumn(nameof(Notificacion.PublicadaUtc)).AsDateTime2().NotNullable()
.WithColumn(nameof(Notificacion.Mensaje)).AsMaxString().Nullable();
}
}
public override void Down() { }
}
Usa nameof(...) para nombres de tabla y columna, y protege el Up() con Schema.Table(...).Exists() para que la migración conviva con una migración inicial que ya cree el esquema completo (patrón real de los módulos de Crono). Más detalle en Migraciones de base de datos.
3. Aportar la entidad al contexto central
Para que el CronoDbContexto incluya la entidad, el módulo registra en su Iniciador una fuente de configuración del contexto:
public override void ConfigurarServicios(IServiceCollection servicios, IAplicacionContexto appContexto)
{
servicios.AddTransient<IDbContextoConfiguracionFuente<CronoDbContexto>, HolaMundoDbContextoConfigurador>();
}
Esa fuente aporta el ensamblado del módulo al modelo, de modo que sus entidades y cualquier IEntityTypeConfiguration<T> se apliquen al contexto central (ver Acceso a datos).
4. Consultar la entidad
Una vez integrada, la entidad se consulta con el propio CronoDbContexto a través de los servicios del módulo, igual que cualquier entidad del núcleo:
var pendientes = await _db.Set<Notificacion>()
.Where(n => n.PublicadaUtc <= DateTime.UtcNow)
.ToListAsync();
Encapsula estas consultas en un servicio del módulo (INotificacionServicio) en lugar de exponer el contexto directamente a los controladores.