【发布时间】:2018-09-15 12:29:59
【问题描述】:
在我的 EF 核心项目中,我有一些从基类 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; }
}
我想为从 DBEntity 继承的每个实体设置一些具有默认值的特定属性。目前我正在使用此代码:
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);
}
}
这很好用,但我不想使用字符串常量指定属性名称(不利于重构等)。
有没有办法遍历继承自 DBEntity 的实体并使用属性表达式来配置默认值,如下所示:
foreach (var entity in entities)
{
entity
.Property(k => k.CreatedOn)
.HasDefaultValueSql("GETDATE()");
// ....
}
重要约束:我不能直接调用modelBuilder.Entity().Property(k => k.CreatedOn),因为它会弄乱所有的表。
【问题讨论】:
-
有可能,但更简单的是使用
nameof而不是字符串常量。 -
@IvanStoev nameof(DBEntity.CreatedOn) 有效!另一种方法是什么?
-
创建一个泛型方法并通过反射调用它。
标签: c# entity-framework entity-framework-core ef-core-2.0