Entity Framework Core RC2 имя таблицы плюрализация

Есть ли способ сделать то, что сделал этот код в EF Core RC 2?

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

Ответ 1

Для EF RC2 нет соглашения. Это от команды EF Core:

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


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


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

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

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


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

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

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


3. Написание пользовательской конвенции:

Просто потому, что у EF Core 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 способов более благоприятными, чем другие, и решили пойти с этим:)

Ответ 2

Версия 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;
}

Ответ 3

В Entity Framework NET core v2 вы можете выбрать pluralize или создать стиль DbSets и Collections с помощью hook.

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

См. этот ответ для получения дополнительной информации: fooobar.com/questions/386052/...

Ответ 4

Для EF Core 3.0 используйте это, чтобы установить свойство TableName (потому что entity.Relational() больше не существует):

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

Ответ 5

Это также опция:

 using System.ComponentModel.DataAnnotations.Schema;

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

хотя вам нужно аннотировать его на каждом объекте