2016-05-27 13 views

Antwort

46

Es gibt keine Konvention für dies als EF RC2 Build. Dies ist aus EF Kernteam:

In der vergangenen Pre-Release von EF-Core, der Tabellenname für eine Entität war die elbe sein, die Klassennamen. In RC2 verwenden wir jetzt den Namen der Eigenschaft DbSet . Wenn für den angegebenen Entitätstyp keine DbSet-Eigenschaft definiert ist, wird der Name der Entitätsklasse verwendet.


Nun, wenn Sie zurück zu den RC1 Namenskonventionen für Tabellen zurückkehren wollen, haben Sie 3 Möglichkeiten, um mit zu gehen:


1. Wahl Singular Namen für DbSet Eigenschaften:

Eine Möglichkeit besteht darin, Ihre DbSet-Eigenschaftsnamen zu vereinzeln (was ich nicht mag). Nehmen wir zum Beispiel haben Sie eine Buch Entität und Sie wollen ein Buch Tabelle zur Karte:

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


2. Mit Totable() Fluent API:

Selbstverständlich können Sie Verwenden Sie die fließende API immer, um alle vorhandenen Konventionen außer Kraft zu setzen und den Tabellennamen beliebig zu bestimmen:

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


3. Benutzerdefinierte Convention Schreiben:

Nur weil EF Core-RC2 keine Konvention für diese hat, heißt das noch lange nicht, dass wir unsere eigenen nicht schreiben können. Um dies zu tun, müssen wir zuerst eine Erweiterungsmethode auf ModelBuilder Objekt erstellen:

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

Und dann nennen wir sie einfach aus dem OnModelCreating Methode auf unserer DbContext Objekt:

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


Beim Schließen:

Ich mag es nicht Plural Tabellennamen und ich mag die letzte Option besser als die anderen und ging damit. Das heißt, es ist meine persönliche Meinung und andere Entwickler finden möglicherweise eine dieser 3 Möglichkeiten günstiger als die anderen und wählen, damit zu gehen :)

+1

Sie Morteza danken. Ich denke, dass ich für den Moment nur den Tabellennamen auf die Entity setzen werde. –

+0

Kein Problem. Sicher, das funktioniert auch :) –

+0

Ich habe auch Ihren Weg zu meiner Antwort hinzugefügt, so dass wir sie alle an einem Ort als einen Bezugspunkt für andere Kollegen Entwickler haben. Vielen Dank. –

4

Die EF Core-Version scheint nicht zu unterstützen entity.DisplayName.Dies ist eine Arbeits Alternative:

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

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

In Entity Framework NET Kern v2 Sie können wählen, pluralize oder DbSets und Collections mit einem Haken vereinzeln.

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

Sehen Sie diese Antwort für weitere Informationen: https://stackoverflow.com/a/47410837/869033