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

煙雲
发布: 2025-12-21 09:30:02
原创
146人浏览过
影子属性是EF Core中仅存在于模型和数据库、不由实体类定义的属性,用于存储审计字段、外键等,需通过Fluent API配置,读写依赖ChangeTracker。

ef core影子属性怎么用 ef core shadow properties教程

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

什么时候该用影子属性

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

  • 数据库表里有 LastModified 列,但你不想把它加进 Blog 类——避免污染领域模型
  • 两个实体有导航关系(比如 PostBlog),但 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" 是纯字符串名,不校验是否在类中存在;类型必须匹配数据库列的实际类型。

Block Survey
Block Survey

BlockSurvey是一个保护隐私和数据安全调查工具,可以让你使用AI来创建调查表单。

Block Survey 71
查看详情 Block Survey

怎么读写影子属性的值

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

  • 写入值(新增或更新时):
    context.Entry(blog).Property("LastUpdated").CurrentValue = DateTime.UtcNow;
  • 查询中使用(生成 SQL 的 WHERE / ORDER BY):
    var blogs = context.Blogs.OrderBy(b => EF.Property(b, "LastUpdated"));
  • 加载后读取当前值:
    var lastTime = context.Entry(blog).Property("LastUpdated").CurrentValue;

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

影子属性的常见陷阱

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

  • 迁移生成时,EF 会自动把影子属性加进 Up(MigrationBuilder),但如果你删了配置,它不会自动删列——得手动处理
  • 不能用于导航属性初始化(比如 Include 不支持影子属性)
  • JSON 列、计算列、触发器维护的字段,如果要用影子属性映射,需确保类型兼容且无冲突
  • 外键影子属性命名有约定:若 PostBlog 导航属性,EF 默认建 BlogId;若没导航属性,则可能叫 BlogBlogId —— 建议显式命名避免歧义

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

以上就是EF Core影子属性怎么用 EF Core Shadow Properties教程的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号