Mysql
 sql >> Datenbank >  >> RDS >> Mysql

EF Core-Konfigurationsproblem mit eigenem Typ, der in zwei verschiedenen Klassen verwendet wird

Aktualisierung (EF Core 3.x):

Immer noch kein öffentlicher Weg, um EntityTypeBuilder zu bekommen , aber zumindest das Konstruktorargument wurde in IMutableEntityType geändert Typ, also nur

using Microsoft.EntityFrameworkCore.Metadata.Builders;

wird benötigt, und der entsprechende Code lautet jetzt

var entityTypeBuilder = new EntityTypeBuilder(entityType);

Original (EF Core 2.x):

Das Problem ist, dass der ClrType reicht nicht aus, um den eigenen Entitätstyp zu identifizieren, daher modelBuilder.Entity(Type) kann nicht zum Abrufen des EntityTypeBuilder verwendet werden Instanz, die für die reibungslose Konfiguration der Entitätseigenschaften benötigt wird.

Scheint, als gäbe es keine gute Öffentlichkeit Möglichkeit, dies in EF Core 2.x zu tun, daher kann ich nur vorschlagen, einige der Interna von EF Core zu verwenden (zum Glück öffentlich zugänglich unter der typischen internen Verwendungswarnung).

Sie benötigen die folgende using s:

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

Der erste ist für EntityTypeBuilder Klasse, die zweite ist für AsEntityType() Erweiterungsmethode, die Ihnen Zugriff auf die interne Klasse gibt, die den IEntityType implementiert , und insbesondere der Builder Eigentum.

Der geänderte Code sieht folgendermaßen aus:

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