影子属性是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" 是纯字符串名,不校验是否在类中存在;类型必须匹配数据库列的实际类型。
影子属性不能通过 blog.LastUpdated 访问,必须走 EF 的专用 API:
context.Entry(blog).Property("LastUpdated").CurrentValue = DateTime.UtcNow;
var blogs = context.Blogs.OrderBy(b => EF.Property(b, "LastUpdated"));
var lastTime = context.Entry(blog).Property("LastUpdated").CurrentValue;
所有操作都依赖 ChangeTracker,所以实体必须已附加(tracked)到上下文。
用起来方便,但几个细节容易踩坑:
Up(MigrationBuilder),但如果你删了配置,它不会自动删列——得手动处理Include 不支持影子属性)Post 有 Blog 导航属性,EF 默认建 BlogId;若没导航属性,则可能叫 BlogBlogId —— 建议显式命名避免歧义基本上就这些。不复杂,但容易忽略写法和生命周期限制。
以上就是EF Core影子属性怎么用 EF Core Shadow Properties教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号