web-dev-qa-db-fra.com

Pluralisation du nom de table Entity Framework Core RC2

Existe-t-il un moyen de faire ce que ce code a fait dans EF Core RC 2?

protected override void OnModelCreating(ModelBuilder modelBuilder)
{    
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
31
Paul Speranza

Il n'y a pas de convention pour cela à partir de la construction d'EF RC2. Il s'agit de l'équipe EF Core:

Dans les versions antérieures d'EF Core, le nom de table d'une entité était le même que le nom de classe d'entité. Dans RC2, nous utilisons maintenant le nom de la propriété DbSet. Si aucune propriété DbSet n'est définie pour le type d'entité donné, le nom de classe d'entité est utilisé.


Maintenant, si vous souhaitez revenir aux conventions de dénomination RC1 pour les tables, vous avez 3 façons de procéder:


1. Choix de noms singuliers pour les propriétés DbSet:

Une façon consiste à singulariser vos noms de propriétés DbSet (ce que je n'aime pas). Supposons par exemple que vous avez une entité Book et que vous souhaitez mapper vers un Book table:

public DbSet<Book> Book { get; set; }


2. Utilisation de l'API ToTable () Fluent:

Vous pouvez bien sûr toujours utiliser une API fluide pour remplacer toute convention en place et dicter le nom de la table à tout ce que vous voulez:

modelBuilder.Entity<Book>().ToTable("Book");


. Écriture d'une convention personnalisée:

Tout simplement parce que EF Core RC2 n'a pas de convention pour cela, cela ne signifie pas que nous ne pouvons pas écrire la nôtre. Pour ce faire, nous devons d'abord créer une méthode d'extension sur l'objet ModelBuilder:

using Microsoft.EntityFrameworkCore.Metadata.Internal;

public static class ModelBuilderExtensions 
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.Relational().TableName = entity.DisplayName();
        }
    }
}

Et puis nous l'appelons simplement à partir de la méthode OnModelCreating sur notre objet DbContext :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.RemovePluralizingTableNameConvention();
}


à la fermeture:

Je n'aime pas les noms de table pluriels et j'aime mieux la dernière option que les autres et je suis allé avec ça. Cela dit, c'est mon opinion personnelle et d'autres développeurs pourraient trouver l'une de ces 3 façons plus favorables que les autres et choisir d'aller avec ça :)

82
Morteza Manavi

La version EF Core ne semble pas prendre en charge entity.DisplayName. Ceci est une alternative de travail:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
    // Skip shadow types
    if (entityType.ClrType == null)
        continue;

    entityType.Relational().TableName = entityType.ClrType.Name;
}
8
Nullius

Dans Entity Framework NET core v2, vous pouvez choisir de pluraliser ou singulariser DbSets et Collections avec un crochet.

public class MyDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
    {
        services.AddSingleton<IPluralizer, MyPluralizer>();
    }
}

public class MyPluralizer : IPluralizer
{
    public string Pluralize(string name)
    {
        return Inflector.Inflector.Pluralize(name) ?? name;
    }

    public string Singularize(string name)
    {
        return Inflector.Inflector.Singularize(name) ?? name;
    }
}

Voir cette réponse pour plus d'informations: https://stackoverflow.com/a/47410837/8690

2
Nick N.

Pour EF Core 3.0, utilisez ceci pour définir la propriété TableName (car entity.Relational() n'existe plus):

public static class ModelBuilderExtensions 
{
    public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
    {
        foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
        {
            entity.SetTableName(entity.DisplayName());
        }
    }
}
0
Métoule

C'est aussi une option:

 using System.ComponentModel.DataAnnotations.Schema;

 [Table("Book")]
 public class Book
 {...}

bien que vous deviez l'annoter sur chaque entité

0
sjors miltenburg