Voglio che il nome della mia classe di dominio corrisponda al nome della mia tabella db (nessuna pluralizzazione).
In EF Core 1.1, ho usato questo codice per farlo:
public static void RemovePluralisingTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes())
{
entityType.Relational().TableName = entityType.DisplayName();
}
}
In EF Core 2.0, questo codice non viene compilato in quanto Relational()
non è un metodo su IMutableEntityType. Ad ogni modo, in EF Core 2.0, hanno aggiunto IPluralizer, documentato qui:
Non ci sono molti esempi per mostrare come ottenere lo stesso comportamento che avevo prima. Qualche idea su come rimuovere la pluralizzazione in EF Core 2?
Puoi usare esattamente lo stesso codice. Relational()
è un metodo di estensione definito nella classe RelationalMetadataExtensions
all'interno dell'assembly Microsoft.EntityFrameworkCore.Relational.dll
, quindi assicurarsi di fare riferimento a esso.
Che dire di IPluralizer
, come puoi vedere dal link è solo un hook di pluralizzazione per DbContext Scaffolding , ovvero generazione di classi di entità dal database, utilizzato per singolarizzare i nomi dei tipi di entità e pluralizzare i nomi DbSet . Non è utilizzato per la generazione di nomi di tabelle. La convenzione del nome di tabella predefinita è spiegata nella sezione Mappatura tabella della documentazione:
Per convenzione, ogni entità verrà configurata per essere
DbSet<TEntity>
su una tabella con lo stesso nome della proprietàDbSet<TEntity>
che espone l'entità sul contesto derivato. Se nessunDbSet<TEntity>
è incluso per l'entità data, viene usato il nome della classe.
Puoi farlo in questo modo senza utilizzare le chiamate API EF interne utilizzando ClrType.Name
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
// Use the entity name instead of the Context.DbSet<T> name
// refs https://docs.microsoft.com/en-us/ef/core/modeling/relational/tables#conventions
modelBuilder.Entity(entityType.ClrType).ToTable(entityType.ClrType.Name);
}
}