影子属性是EF Core中仅存在于模型和数据库、不由实体类定义的属性,用于存储审计字段、外键等,需通过Fluent API配置,读写依赖ChangeTracker。

EF Core 影子属性(Shadow Properties)不是你实体类里定义的字段,而是只存在于 EF Core 模型和数据库中、由框架在背后管理的属性。它不占实体类代码空间,却能参与查询、排序、保存和变更跟踪——特别适合存审计字段(如 LastUpdated、CreatedBy)、外键值或临时业务标记。
什么时候该用影子属性
以下情况直接考虑影子属性:
- 数据库表里有
LastModified列,但你不想把它加进Blog类——避免污染领域模型 - 两个实体有导航关系(比如
Post→Blog),但Post类里没写BlogId字段,EF 会自动创建影子外键(如BlogId) - 需要对某列做全局排序或过滤(比如按
CreatedAt倒序查),又不希望每个 DTO 或 ViewModel 都暴露它 - 做软删除时,
IsDeleted存在数据库但不暴露给上层业务逻辑层
怎么定义影子属性
只能通过 Fluent API 在 OnModelCreating 中配置,不能用数据注解(Data Annotations)。
例如为 Blog 添加 LastUpdated 影子属性:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property<DateTime>("LastUpdated") // 名字是字符串,类型是泛型参数
.HasDefaultValueSql("GETUTCDATE()"); // 可选:设默认值(SQL Server)
}登录后复制
注意:"LastUpdated" 是纯字符串名,不校验是否在类中存在;类型必须匹配数据库列的实际类型。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~