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