2017-09-29 4 views
0

Je souhaite que mon nom de classe de domaine corresponde à mon nom de table db (pas de pluralisation).Utilisation de noms de table singuliers avec EF Core 2

Dans EF Core 1.1, j'ai utilisé ce code pour le faire:

public static void RemovePluralisingTableNameConvention(this ModelBuilder modelBuilder) 
{ 
    foreach (IMutableEntityType entityType in modelBuilder.Model.GetEntityTypes()) 
    { 
     entityType.Relational().TableName = entityType.DisplayName(); 
    } 
} 

Dans EF Core 2.0, ce code ne compile pas Relational() n'est pas une méthode sur IMutableEntityType. Quoi qu'il en soit, dans EF Core 2.0, ils ont ajouté IPluralizer, documenté ici:

https://github.com/aspnet/EntityFramework.Docs/blob/master/entity-framework/core/what-is-new/index.md#pluralization-hook-for-dbcontext-scaffolding

Il n'y a pas beaucoup d'exemples pour montrer comment obtenir le même comportement que j'avais avant. Toute idée de la façon de supprimer la pluralisation dans EF Core 2?

+0

La convention d'EF Core 2.0 consiste à utiliser un nom DbSet pour une table. Si vous n'avez jamais spécifié de DbSet pour une table, EF Core utilisera le nom de la classe comme nom de la table. Évidemment, tout ceci est ignoré si vous avez spécifié le nom de la table en utilisant ToTable dans le mappage fluide. –

Répondre

1

Vous pouvez utiliser exactement le même code. Relational() est extension méthode définie dans la classe RelationalMetadataExtensions à l'intérieur Microsoft.EntityFrameworkCore.Relational.dllassembly, alors assurez-vous que vous faites référence.

Qu'en est-IPluralizer, comme vous pouvez le voir sur le lien, il est juste un crochet pluralisation pour DbContext échafaudage, à savoir la génération de classe d'entité de base de données, utilisée pour singulariser les noms de type d'entité et pluralize noms DbSet. Il n'est pas utilisé pour la génération de nom de table. La convention de nom de la table par défaut est expliqué dans la section Table Mapping de la documentation:

Par convention, chaque entité sera configuré pour la carte à une table avec le même nom que la propriété DbSet<TEntity> qui expose l'entité du contexte dérivé. Si aucun DbSet<TEntity> n'est inclus pour l'entité donnée, le nom de classe est utilisé.