Mysql
 sql >> Database >  >> RDS >> Mysql

Problema di configurazione di EF Core con il tipo di proprietà utilizzato in 2 classi diverse

Aggiornamento (EF Core 3.x):

Ancora nessun modo pubblico per ottenere EntityTypeBuilder , ma almeno l'argomento del costruttore è stato modificato per essere IMutableEntityType digita, quindi solo

using Microsoft.EntityFrameworkCore.Metadata.Builders;

è necessario e il codice corrispondente ora è

var entityTypeBuilder = new EntityTypeBuilder(entityType);

Originale (EF Core 2.x):

Il problema è che il ClrType non è sufficiente per identificare il tipo di entità di proprietà, quindi modelBuilder.Entity(Type) non può essere utilizzato per ottenere EntityTypeBuilder istanza necessaria per configurare in modo fluido le proprietà dell'entità.

Sembra che non ci sia un buon pubblico modo per farlo in EF Core 2.x, quindi tutto ciò che posso suggerire è utilizzare alcuni degli interni di EF Core (fortunatamente accessibile pubblicamente sotto il tipico avviso di utilizzo interno).

Avresti bisogno del seguente using s:

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

Il primo è per EntityTypeBuilder class, la seconda è per AsEntityType() metodo di estensione che ti dà accesso alla classe interna che implementa IEntityType , ed in particolare il Builder proprietà.

Il codice modificato si presenta così:

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)");
        }
    }
}