El paso a paso o código que verás en este post es la resolución más eficiente y válida que hallamos a tu duda o problema.
Solución:
¿Algo como esto podría funcionar (no probado)?
public abstract class BaseEntityTypeConfiguration : IEntityTypeConfiguration
where TBase : BaseEntity
public virtual void Configure(EntityTypeBuilder entityTypeBuilder)
//Base Configuration
public class MaintainerConfiguration : BaseEntityTypeConfiguration
public override void Configure(EntityTypeBuilder entityTypeBuilder)
entityTypeBuilder.Property(b => b.CreatedDateUtc).HasDefaultValueSql("CURRENT_TIMESTAMP");
base.Configure(entityTypeBuilder);
Hay otra forma de resolver el problema, y es usar Método de plantilla Patrón de diseño. Como esto:
public abstract class BaseEntityTypeConfiguration : IEntityTypeConfiguration
where TBase : BaseEntity
public void Configure(EntityTypeBuilder entityTypeBuilder)
//Base Configuration
ConfigureOtherProperties(builder);
public abstract void ConfigureOtherProperties(EntityTypeBuilder builder);
public class MaintainerConfiguration : BaseEntityTypeConfiguration
public override void ConfigureOtherProperties(EntityTypeBuilder entityTypeBuilder)
entityTypeBuilder.Property(b => b.CreatedDateUtc).HasDefaultValueSql("CURRENT_TIMESTAMP");
De esta manera, no necesita escribir ninguna línea en la configuración secundaria.
Otro enfoque si no desea repetir las Definiciones de columna para todos sus Modelos que heredan de la misma Entidad base como esta:
protected override void OnModelCreating(ModelBuilder modelBuilder)
modelBuilder.Entity()
.Property(b => b.CreatedDateTime)
.HasDefaultValueSql("CURRENT_TIMESTAMP ");
modelBuilder.Entity()
.Property(b => b.CreatedDateTime)
.HasDefaultValueSql("CURRENT_TIMESTAMP ");
// …
es encontrar todas las Entidades que se heredan de la Entidad base, recorrerlas y llamar al Método genérico como se muestra a continuación, en el que se coloca la Lógica redundante:
protected override void OnModelCreating(ModelBuilder modelBuilder)
foreach (Type type in GetEntityTypes(typeof(BaseEntity)))
var method = SetGlobalQueryMethod.MakeGenericMethod(type);
method.Invoke(this, new object[] modelBuilder );
static readonly MethodInfo SetGlobalQueryMethod = typeof(/*your*/Context)
.GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Single(t => t.IsGenericMethod && t.Name == "SetGlobalQuery");
public void SetGlobalQuery(ModelBuilder builder) where T : BaseEntity
builder.Entity().Property(o => o.CreatedDateTime).HasDefaultValueSql("CURRENT_TIMESTAMP");
// Additional Statements
Para el método “GetEntityTypes”, necesita el paquete Nuget “Microsoft.Extensions.DependencyModel”
private static IList _entityTypeCache;
private static IList GetEntityTypes(Type type)
if (_entityTypeCache != null && _entityTypeCache.First().BaseType == type)
return _entityTypeCache.ToList();
_entityTypeCache = (from a in GetReferencingAssemblies()
from t in a.DefinedTypes
where t.BaseType == type
select t.AsType()).ToList();
return _entityTypeCache;
private static IEnumerable GetReferencingAssemblies()
var assemblies = new List();
var dependencies = DependencyContext.Default.RuntimeLibraries;
foreach (var library in dependencies)
try
var assembly = Assembly.Load(new AssemblyName(library.Name));
assemblies.Add(assembly);
catch (FileNotFoundException)
return assemblies;
En mi opinión, es un poco complicado, ¡pero funciona bien para mí!
La fuente con más detalles:
https://www.codingame.com/playgrounds/5514/multi-tenant-asp-net-core-4—applying-tenant-rules-to-all-enitites
No se te olvide mostrar este escrito si si solucionó tu problema.