2016-05-27 37 views

risposta

46

Non vi è alcuna convenzione per questo di EF RC2 build. Questo è da EF squadra Nucleo:

In passato pre-release di EF core, il nome della tabella per un'entità è stata la uguale al nome classe di entità. In RC2 ora utilizziamo il nome della proprietà DbSet . Se non viene definita alcuna proprietà DbSet per il tipo di entità specificato, viene utilizzato il nome della classe di entità.


Ora, se si vuole tornare alle convenzioni di denominazione RC1 per le tabelle, si hanno 3 modi per andare con:


1. scelta dei nomi singolari per le proprietà DbSet:

Un modo è singolarizzare i nomi delle proprietà DbSet (che non mi piacciono). Diciamo per esempio, si dispone di un Libro entità e si desidera associare a un libro tavolo:

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


2. Utilizzando ToTable() API Fluent:

Ovviamente si può usa sempre API fluente per sovrascrivere qualsiasi convenzione e dettare il nome della tabella per qualsiasi cosa tu voglia:

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


3. Scrivi Convenzione personalizzato:

Solo perché EF Nucleo RC2 non ha una convenzione per questo, non significa che non siamo in grado di scrivere la nostra. Per farlo, in primo luogo abbiamo bisogno di creare un metodo di estensione sul ModelBuilder oggetto:

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

E poi abbiamo semplicemente chiamiamo dal metodo OnModelCreating sul nostro DbContext oggetto:

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


in chiusura:

non mi piace nomi di tabelle plurali e mi piace l'ultima opzione meglio degli altri e sono andato con quello. Detto questo, è la mia opinione personale e altri sviluppatori potrebbero trovare uno di questi 3 modi più favorevoli degli altri e scegliere di andare con quello :)

+1

Grazie Morteza. Penso che per ora imposterò il nome della tabella sull'entità. –

+0

Nessun problema. Certo, funziona anche così :) –

+0

Ho anche aggiunto la tua strada alla mia risposta in modo che li abbiamo tutti in un posto come punto di riferimento per altri colleghi sviluppatori. Grazie. –

4

La versione EF Core non sembra supportare entity.DisplayName.Si tratta di un'alternativa di lavoro:

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

    entityType.Relational().TableName = entityType.ClrType.Name; 
} 
2

Nel nucleo Entity Framework .NET v2 è possibile scegliere di plurale o singolarizzare DbSets e Collections con un gancio.

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

Vedere questa risposta per ulteriori informazioni: https://stackoverflow.com/a/47410837/869033

Problemi correlati