Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème de configuration EF Core avec le type propriétaire utilisé dans 2 classes différentes

Mise à jour (EF Core 3.x) :

Toujours pas de moyen public d'obtenir EntityTypeBuilder , mais au moins l'argument du constructeur a été modifié pour être IMutableEntityType type, donc seulement

using Microsoft.EntityFrameworkCore.Metadata.Builders;

est nécessaire, et le code correspondant est maintenant

var entityTypeBuilder = new EntityTypeBuilder(entityType);

Original (EF Core 2.x) :

Le problème est que le ClrType n'est pas suffisant pour identifier le type d'entité détenue, d'où modelBuilder.Entity(Type) ne peut pas être utilisé pour obtenir le EntityTypeBuilder instance nécessaire pour configurer facilement les propriétés de l'entité.

On dirait qu'il n'y a pas de bon public façon de faire cela dans EF Core 2.x, donc tout ce que je peux suggérer est d'utiliser certains des internes EF Core (heureusement accessible au public sous l'avertissement d'utilisation interne typique).

Vous auriez besoin du using suivant s :

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

Le premier est pour EntityTypeBuilder classe, la seconde est pour AsEntityType() méthode d'extension qui vous donne accès à la classe interne implémentant le IEntityType , et en particulier le Builder propriété.

Le code modifié ressemble à ceci :

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