Есть ли способ сделать то, что сделал этот код в EF Core RC 2?
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Есть ли способ сделать то, что сделал этот код в EF Core RC 2?
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Для 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 способов более благоприятными, чем другие, и решили пойти с этим:)
Версия 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;
}
В 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/...
Для 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());
}
}
}
Это также опция:
using System.ComponentModel.DataAnnotations.Schema;
[Table("Book")]
public class Book
{...}
хотя вам нужно аннотировать его на каждом объекте