Postgresql 在OnModelCreating中未应用EF核心实体配置

Postgresql 在OnModelCreating中未应用EF核心实体配置,postgresql,.net-core,entity-framework-core,Postgresql,.net Core,Entity Framework Core,我有一个简单的(目前)上下文,它使用一些基类,如下所示: public abstract class EntityBase { public int Id { get; set; } } public abstract class TranslatableEntityBase : EntityBase { public string TranslationKey { get; set; } public TranslatableEntityBase(string tra

我有一个简单的(目前)上下文,它使用一些基类,如下所示:

public abstract class EntityBase
{
    public int Id { get; set; }
}

public abstract class TranslatableEntityBase : EntityBase
{
    public string TranslationKey { get; set; }
    public TranslatableEntityBase(string translationKey) : base()
    {
        TranslationKey = translationKey;
    }
}

public class Country : TranslatableEntityBase
{
    public Country(string name, string code, string translationKey) 
    : base(translationKey)
    {
        Name = name;
        Code = code;
    }

    public string Name { get; set; }
    public string Code { get; set; }
}

public abstract class EntityBaseConfiguration<T> : IEntityTypeConfiguration<T> where T : EntityBase
{
    public virtual void Configure(EntityTypeBuilder<T> builder)
    {

    }
}

public abstract class TranslatableEntityBaseConfiguration<T> : EntityBaseConfiguration<T> where T : TranslatableEntityBase
{
    // Hide parent method to provide overridable one to children
    public new virtual void Configure(EntityTypeBuilder<T> builder)
    {
        base.Configure(builder);

        builder.Property(e => e.TranslationKey)
               .IsRequired()
               .HasMaxLength(255);
    }
}

public class CountryConfiguration : TranslatableEntityBaseConfiguration<Country>
{
    public override void Configure(EntityTypeBuilder<Country> builder)
    {
        base.Configure(builder);

        builder.Property(c => c.Name)
               .IsRequired()
               .HasMaxLength(255);

        builder.Property(c => c.Code)
               .IsRequired()
               .HasMaxLength(3);
    }
}
这些配置还有如下基类:

public abstract class EntityBase
{
    public int Id { get; set; }
}

public abstract class TranslatableEntityBase : EntityBase
{
    public string TranslationKey { get; set; }
    public TranslatableEntityBase(string translationKey) : base()
    {
        TranslationKey = translationKey;
    }
}

public class Country : TranslatableEntityBase
{
    public Country(string name, string code, string translationKey) 
    : base(translationKey)
    {
        Name = name;
        Code = code;
    }

    public string Name { get; set; }
    public string Code { get; set; }
}

public abstract class EntityBaseConfiguration<T> : IEntityTypeConfiguration<T> where T : EntityBase
{
    public virtual void Configure(EntityTypeBuilder<T> builder)
    {

    }
}

public abstract class TranslatableEntityBaseConfiguration<T> : EntityBaseConfiguration<T> where T : TranslatableEntityBase
{
    // Hide parent method to provide overridable one to children
    public new virtual void Configure(EntityTypeBuilder<T> builder)
    {
        base.Configure(builder);

        builder.Property(e => e.TranslationKey)
               .IsRequired()
               .HasMaxLength(255);
    }
}

public class CountryConfiguration : TranslatableEntityBaseConfiguration<Country>
{
    public override void Configure(EntityTypeBuilder<Country> builder)
    {
        base.Configure(builder);

        builder.Property(c => c.Name)
               .IsRequired()
               .HasMaxLength(255);

        builder.Property(c => c.Code)
               .IsRequired()
               .HasMaxLength(3);
    }
}
公共抽象类EntityBaseConfiguration:EntityTypeConfiguration其中T:EntityBase
{
公共虚拟空间配置(EntityTypeBuilder)
{
}
}
公共抽象类TranslateableEntityBaseConfiguration:EntityBaseConfiguration,其中T:TranslateableEntityBase
{
//隐藏父方法以向子级提供可重写的父方法
公共新虚拟空配置(EntityTypeBuilder)
{
配置(生成器);
builder.Property(e=>e.TranslationKey)
.IsRequired()
.HasMaxLength(255);
}
}
公共类CountryConfiguration:TranslateableEntityBaseConfiguration
{
公共覆盖无效配置(EntityTypeBuilder)
{
配置(生成器);
builder.Property(c=>c.Name)
.IsRequired()
.HasMaxLength(255);
builder.Property(c=>c.Code)
.IsRequired()
.HasMaxLength(3);
}
}
我的上下文是这样定义的:

public class MyContext : DbContext
{
    public MyContext(DbContextOptions options)
        : base(options)
    {

    }

    public DbSet<Country> Countries { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
    }
}
公共类MyContext:DbContext
{
公共MyContext(DbContextOptions)
:基本(选项)
{
}
公共数据库集国家{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
基于模型创建(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
}
}
当我运行
dotnet ef migrations add InitialMigration
时,它会创建迁移,但不会应用实体的配置(没有最大长度或要求)

我已经尝试使用
modelBuilder.ApplyConfiguration(newcountryconfiguration())但结果相同

我错过了什么?是因为继承吗

谢谢

好的,我找到了

我只需要做
translateableEntityBaseConfiguration
inherit
EntityTypeConfiguration

公共抽象类translateableEntityBaseConfiguration:EntityBaseConfiguration,EntityTypeConfiguration其中T:TranslateableEntityBase
{
//隐藏父方法以向子级提供可重写的父方法
公共新虚拟空配置(EntityTypeBuilder)
{
配置(生成器);
builder.Property(e=>e.TranslationKey)
.IsRequired()
.HasMaxLength(255);
}
}
我真的不知道为什么

编辑: 我找到了另一种更干净的方法,从这个类中删除
newvirtual
,改为使用
override
。这并不妨碍我在最后一个类中重写(我天真地认为)