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
inheritEntityTypeConfiguration
公共抽象类translateableEntityBaseConfiguration:EntityBaseConfiguration,EntityTypeConfiguration其中T:TranslateableEntityBase
{
//隐藏父方法以向子级提供可重写的父方法
公共新虚拟空配置(EntityTypeBuilder)
{
配置(生成器);
builder.Property(e=>e.TranslationKey)
.IsRequired()
.HasMaxLength(255);
}
}
我真的不知道为什么
编辑:
我找到了另一种更干净的方法,从这个类中删除newvirtual
,改为使用override
。这并不妨碍我在最后一个类中重写(我天真地认为)