gpt4 book ai didi

c# - 如何在 IDesignTimeServices 中正确使用 IPluralizer

转载 作者:行者123 更新时间:2023-12-02 10:09:41 26 4
gpt4 key购买 nike

在我的应用程序中,我使用代码优先方法,并且仅通过 IEntityTypeConfiguration<> 将实体添加到 DbContext 。我的目标是实现复数表名称,即 ModelsModel

阅读后documentation , article , This question我的理解是我的复数应该注册为 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)));
}
}

Startup.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
}
}

最佳答案

链接的文章不正确。从Pluralization hook for DbContext Scaffolding可以看出EF Core 文档:

EF Core 2.0 introduces a new IPluralizer service that is used to singularize entity type names and pluralize DbSet names.

简而言之,它仅由脚手架命令使用,因此不能用于更改表名模型 conventions

一般来说,迁移工具按照约定、数据注释和流畅 API 的配置方式使用模型。因此,应用自定义约定应该使用 OnModelCreating 中的模型 API。像这样的事情:

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

其中 GetTableName 方法实现您的命名约定:

string GetTableName(IEntityType entityType)
{
// use entiityType.Name and other info
return ...;
}

更新(EF Core 3.0+):使用 entityType.SetTableName(...) 代替 entityType.Relational().TableName = .. .

关于c# - 如何在 IDesignTimeServices 中正确使用 IPluralizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53734540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com