2016-05-27 8 views

ответ

46

Для этого не существует конвенции для сборки EF RC2. Это из основной команды EF:

В прошлом пре-релиз EF Ядра, имя таблицы для объекта был совпадает с именем класса сущности. В RC2 теперь мы используем имя свойства DbSet . Если для данного типа сущности не определено свойство DbSet, то используется имя класса сущности.


Теперь, если вы хотите, чтобы вернуться к конвенциям RC1 именовании для таблиц, у вас есть 3 пути пойти с:


1. Выбор Сингулярные имен для DbSet Свойства:

Один из способов - создать уникальные имена свойств DbSet (которые мне не нравятся). Скажем, например, у вас есть книги сущность и вы хотите отобразить в книги стол:

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


2. Использование ToTable() Fluent API:

Вы можете, конечно, всегда используйте свободный API, чтобы переопределить любое соглашение на месте и диктовать имя таблицы для всего, что вы хотите:

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


3. Дать Таможенную конвенцию:

Просто потому, что EF Ядро RC2 не имеют конвенций для этого, это не значит, что мы не можем написать наши собственные. Для этого, во-первых, мы должны создать метод расширения на 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(); 
     } 
    } 
} 

И тогда мы просто называем его из метода OnModelCreating на нашем DbContext объекта:

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


Закрытие:

Мне не нравится множественные имена таблиц, и мне нравится последний вариант лучше, чем другие, и пошел с этим. Тем не менее, это мое личное мнение, и другие разработчики могут найти любой из этих 3 способов более благоприятными, чем другие, и решили пойти с этим :)

+1

Спасибо Morteza. Я думаю, что на данный момент я просто установил имя таблицы в сущности. –

+0

Нет проблем. Конечно, это тоже работает :) –

+0

Я также добавил свой путь к моему ответу, чтобы у нас были все они в одном месте в качестве ориентира для других разработчиков-разработчиков. Благодарю. –

4

Версия EF Core, похоже, не поддерживает entity.DisplayName.Это рабочий вариант:

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

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

В ядре Entity Framework NET v2 можно выбрать множественном числе или DbSets и образовывать форму единственного числа Collections с крючком.

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

Смотрите этот ответ для получения дополнительной информации: https://stackoverflow.com/a/47410837/869033

 Смежные вопросы

  • Нет связанных вопросов^_^