Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problema de configuração do EF Core com tipo de propriedade usado em 2 classes diferentes


Atualização (EF Core 3.x):

Ainda não há maneira pública de obter EntityTypeBuilder , mas pelo menos o argumento do construtor foi modificado para ser IMutableEntityType tipo, apenas
using Microsoft.EntityFrameworkCore.Metadata.Builders;

é necessário, e o código correspondente agora é
var entityTypeBuilder = new EntityTypeBuilder(entityType);

Original (EF Core 2.x):

O problema é que o ClrType não é suficiente para identificar o tipo de entidade de propriedade, portanto, modelBuilder.Entity(Type) não pode ser usado para obter o EntityTypeBuilder instância necessária para configurar fluentemente as propriedades da entidade.

Parece que não existe um bom público maneira de fazer isso no EF Core 2.x, então tudo o que posso sugerir é usar alguns dos internos do EF Core (felizmente acessível ao público sob o aviso de uso interno típico).

Você precisaria do seguinte using s:
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

A primeira é para EntityTypeBuilder classe, a segunda é para AsEntityType() método de extensão que lhe dá acesso à classe interna que implementa o IEntityType , e em particular o Builder propriedade.

O código modificado fica assim:
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)");
        }
    }
}