- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我使用代码优先方法,并且仅通过 IEntityTypeConfiguration<>
将实体添加到 DbContext 。我的目标是实现复数表名称,即 Models 为 Model。
阅读后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 pluralizeDbSet
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/
我的应用程序中有 Dal 类,它们使用 EF 数据库拳头的数据库脚手架。为了以正确的方式对表格进行单数化/复数化,我通过实现 Microsoft.EntityFrameworkCore.Design
在我的应用程序中,我使用代码优先方法,并且仅通过 IEntityTypeConfiguration<> 将实体添加到 DbContext 。我的目标是实现复数表名称,即 Models 为 Model。
我是一名优秀的程序员,十分优秀!