I have a base model:
public abstract class Status
{
public string updateUserName { get; set; }
}
Then a model which extends the base m
If I understand correctly, the Status
is just a base class and not a base entity participating in Database Inheritance.
In such case it's important to never refer to Status
class directly inside entity model and configuration, i.e. no DbSet<Status>
, no navigation properties of type Status
or ICollection<Status>
, no modelBuilder.Entity<Status>()
calls and no IEntityTypeConfiguration<Status>
.
Instead, you always have to refer to the concrete types inheriting from the Status
. In order to reuse configuration code, you should use constrained generic methods or classes and pass the concrete entity types.
Since you are using IEntityTypeConfiguration
classes, probably the most natural is to make your StatusConfiguration
class generic:
public class StatusConfiguration<TEntity> : IEntityTypeConfiguration<TEntity>
where TEntity : Status
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.Property(c => c.updateUserName).IsRequired().HasMaxLength(50);
}
}
and let derived entity configuration classes derive from it:
public class ItemConfiguration : StatusConfiguration<Item>
{
public override void Configure(EntityTypeBuilder<Item> builder)
{
base.Configure(builder); // <--
builder.ToTable("Item", "dbo").HasKey(c => c.Id);
builder.Property(c => c.Description).IsRequired().HasMaxLength(100);
}
}