Saltar al contenido

Usar IEntityTypeConfiguration con una entidad base

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *