sql >> Base de Datos >  >> RDS >> Mysql

Problema de configuración de EF Core con tipo propio utilizado en 2 clases diferentes

Actualización (EF Core 3.x):

Todavía no hay forma pública de obtener EntityTypeBuilder , pero al menos el argumento del constructor se ha modificado para que sea IMutableEntityType tipo, por lo que sólo

using Microsoft.EntityFrameworkCore.Metadata.Builders;

es necesario, y el código correspondiente ahora es

var entityTypeBuilder = new EntityTypeBuilder(entityType);

Original (EF Core 2.x):

El problema es que el ClrType no es suficiente para identificar el tipo de entidad de propiedad, por lo tanto, modelBuilder.Entity(Type) no se puede utilizar para obtener el EntityTypeBuilder instancia necesaria para configurar con fluidez las propiedades de la entidad.

Parece que no hay un buen público forma de hacerlo en EF Core 2.x, así que todo lo que puedo sugerir es usar algunos de los internos de EF Core (afortunadamente accesible públicamente bajo la típica advertencia de uso interno).

Necesitarías lo siguiente using s:

using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

El primero es para EntityTypeBuilder clase, la segunda es para AsEntityType() método de extensión que le da acceso a la clase interna que implementa el IEntityType , y en particular el Builder propiedad.

El código modificado se ve así:

var entityTypes = modelBuilder.Model.GetEntityTypes()
    .ToList();

foreach (var entityType in entityTypes)
{
    var properties = entityType
        .GetProperties()
        .ToList();

    // (1)
    var entityTypeBuilder = new EntityTypeBuilder(entityType.AsEntityType().Builder);

    foreach (var property in properties)
    {
        if (property.PropertyInfo == null)
        {
            continue;
        }

        if (property.PropertyInfo.PropertyType.IsBoolean())
        {
            entityTypeBuilder // (2)
            .Property(property.Name)
            .HasConversion(new BoolToZeroOneConverter<short>())
            .HasColumnType("tinyint(1)");
        }
    }
}