In my EF core project I have a few entities that inherit from a base class DBEntity:
public abstract class DBEntity
{
public int Id { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
public EntityStatus EntityStatus { get; set; }
}
I want to set some specific properties with default value for every entity that inherits from DBEntity. Currently I'm using this code:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var entities = modelBuilder.Model
.GetEntityTypes()
.Where(w => w.ClrType.IsSubclassOf(typeof(DBEntity)))
.Select(p => modelBuilder.Entity(p.ClrType));
foreach (var entity in entities)
{
entity
.Property("CreatedOn")
.HasDefaultValueSql("GETDATE()");
entity
.Property("UpdatedOn")
.HasComputedColumnSql("GETDATE()");
entity
.Property("EntityStatus")
.HasDefaultValue(EntityStatus.Created);
}
}
This works fine but I don't want to specify property names using string constants (bad for refactoring etc.).
Is there a way to loop through entities that inherit from DBEntity and use property expression to configure default values like this:
foreach (var entity in entities)
{
entity
.Property(k => k.CreatedOn)
.HasDefaultValueSql("GETDATE()");
// ....
}
Important constraint: I cannot directly call modelBuilder.Entity().Property(k => k.CreatedOn) because it will mess up all tables.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…