Как правильно использовать IPluralizer в IDesignTimeServices - PullRequest
0 голосов
/ 12 декабря 2018

В моем приложении я использую код-первый подход и добавляю сущности в DbContext только через IEntityTypeConfiguration<>.Моя цель состоит в том, чтобы получить имена таблиц во множественном числе, например Модели для Модель .

После прочтения документации , статьи , Этот вопрос Насколько я понимаю, мой плюрализатор должен быть зарегистрирован и использоваться как IPluralizer при создании миграции, однако это не так.

Конечно, я мог бы неявно использовать DbSet<Model> Models {get;set;} или использоватьbuilder.ToTable("Models");, но в моем общем сценарии я бы хотел этого избежать, тем более что я хотел бы, чтобы некоторые модели не перекрывали абстрактный общий сценарий.

Вопрос в том, что я делаю что-то не так или неправильно понимаюкак он должен вести себя

AppDesignService.cs

public class AppDesignService : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection services)
    {
        Debugger.Launch();
        services.AddSingleton<IPluralizer, InflectorPluralizer>();
    }
}

MyDbContext.cs

public class AppDbContext : IdentityDbContext<AppUser,AppRole,Guid>
{
    public EmsDbContext(DbContextOptions options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        base.OnModelCreating(builder);

        builder.ApplyConfigurationsFromAssembly(Assembly.GetAssembly(typeof(AppDbContext)));
    }
}

Запуск.cs

public void ConfigureServices(IServiceCollection services)
{
    var connectionString = Configuration.GetConnectionString("DefaultConnection");

    services.AddDbContext<DbContext, AppDbContext>(opt =>
     {
         opt.UseSqlServer(connectionString, sqlOpt =>
         {
             sqlOpt.EnableRetryOnFailure(3);
         });
     });

     // code skipped for brevity
}

Конфиг

public interface IEntity
{
    int Id {get;set;}
}

public class Model : IEntity
{
    public int Id {get;set;}
    public string Name {get;set;}
}



public abstract class DbEntityConfig<T> : IEntityTypeConfiguration<T>
    where T : class, IEntity
{
    public void Configure(EntityTypeBuilder<T> builder)
    {
        builder.HasKey(m => m.Id);
    }
}


public class ModelEntityConfig : DbEntityConfig<Model>
{
    public void Configure(EntityTypeBuilder<Model> builder)
    {
        base.Configure(builder);

        // Of course I want to avoid this call, cos TheOtherModel might not override base method
        // builder.ToTable("Models");

        builder.Property(m => m.Name).HasMaxLength(25);
    }
}

Результат

public partial class Test : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Model",
            columns: table => new

            // code skipped for brevity
    }
}

Ожидаетсярезультат:

public partial class Test : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Models",
            columns: table => new

            // code skipped for brevity
    }
}

1 Ответ

0 голосов
/ 12 декабря 2018

Ссылка на статью неверна.Как видно из Перехватчик плюрализации для DbContext Scaffolding Документация EF Core:

EF Core 2.0 представляет новый сервис IPluralizer, который используется для сингулярности имен типов сущностей и множественного числа DbSet names.

Вкратце, он используется только командами скаффолдинга, поэтому его нельзя использовать для изменения модели имен таблиц соглашений .

Как правило, инструменты миграции используют модель в соответствии с соглашениями, аннотациями данных и свободным API.Таким образом, применение пользовательского соглашения должно быть с API модели внутри OnModelCreating.Примерно так:

foreach (var entityType in modelBuilder.Model.GetEntityTypes())
    entityType.Relational().TableName = GetTableName(entityType);

, где GetTableName метод реализует ваше соглашение об именах:

string GetTableName(IEntityType entityType)
{
    // use entiityType.Name and other info
    return ...; 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...