通八洲科技

EF Core影子属性怎么用 EF Core Shadow Properties教程

日期:2025-12-21 00:00 / 作者:煙雲
影子属性是EF Core中仅存在于模型和数据库、不由实体类定义的属性,用于存储审计字段、外键等,需通过Fluent API配置,读写依赖ChangeTracker。

EF Core 影子属性(Shadow Properties)不是你实体类里定义的字段,而是只存在于 EF Core 模型和数据库中、由框架在背后管理的属性。它不占实体类代码空间,却能参与查询、排序、保存和变更跟踪——特别适合存审计字段(如 LastUpdatedCreatedBy)、外键值或临时业务标记。

什么时候该用影子属性

以下情况直接考虑影子属性:

怎么定义影子属性

只能通过 Fluent API 在 OnModelCreating 中配置,不能用数据注解(Data Annotations)。

例如为 Blog 添加 LastUpdated 影子属性:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity()
        .Property("LastUpdated")     // 名字是字符串,类型是泛型参数
        .HasDefaultValueSql("GETUTCDATE()");   // 可选:设默认值(SQL Server)
}

注意:"LastUpdated" 是纯字符串名,不校验是否在类中存在;类型必须匹配数据库列的实际类型。

怎么读写影子属性的值

影子属性不能通过 blog.LastUpdated 访问,必须走 EF 的专用 API:

所有操作都依赖 ChangeTracker,所以实体必须已附加(tracked)到上下文。

影子属性的常见陷阱

用起来方便,但几个细节容易踩坑:

基本上就这些。不复杂,但容易忽略写法和生命周期限制。