2016-05-27 7 views

Répondre

46

Il n'y a pas de convention pour cela à partir de la construction EF RC2. Ceci est de EF équipe de base:

Dans le passé pré-version de EF de base, le nom de la table pour une entité était la même que le nom de la 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 la classe d'entité est utilisé.


Maintenant, si vous voulez revenir aux conventions de nommage RC1 pour les tables, vous avez 3 façons d'aller avec:


1. Choisir des noms Singular pour les propriétés DbSet:

Une façon est de singulariser vos noms de propriété DbSet (que je n'aime pas). Disons, par exemple, vous avez un livre entité et vous souhaitez mapper à un livre table:

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


2. En utilisant Totable() API Courant:

Vous pouvez bien sûr utilisez toujours l'API fluide pour remplacer toute convention en place et dictez le nom de la table comme vous le souhaitez:

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


3. Rédaction d'une convention personnalisée:

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

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 nous appelons simplement de la méthode OnModelCreating sur notre DbContext objet:

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


À la fermeture:

Je n'aime pas noms de table pluriel et j'aime la dernière option mieux que les autres et est 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 :)

+1

Merci Morteza. Je pense que pour l'instant je vais juste définir le nom de la table sur l'entité. –

+0

Pas de problème. Bien sûr, cela fonctionne aussi :) –

+0

J'ai également ajouté votre chemin à ma réponse afin que nous les ayons tous en un seul endroit comme point de référence pour d'autres développeurs. Merci. –

4

La version EF Core ne semble pas supporter 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; 
} 
2

Dans base Entity Framework NET v2 vous pouvez choisir de pluralize 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/869033