讲师中心 微信公众号
AI工具推荐 视频效率加速

C# 影子属性Shadow Property方法 C# EF Core中的影子属性是什么

夏敏同学_7727

夏敏同学_7727

发布时间:2026-02-12 12:52:06

|

637人浏览过

|

来源于php中文网

原创

影子属性是EF Core中仅存在于模型和数据库、不映射到C#类字段的属性,需在OnModelCreating中用Fluent API配置,通过ChangeTracker或EF.Property读写,适用于审计字段、软删除等场景。

c# 影子属性shadow property方法 c# ef core中的影子属性是什么

Shadow Property 是 EF Core 中一种“只活在模型和数据库里、却不在你的 C# 类中出现”的属性。它不占实体类字段,但能参与查询、排序、保存和变更跟踪——本质上是 EF Core 帮你悄悄管理的一列数据。


影子属性怎么定义?只能用 OnModelCreating + Fluent API

你不能用 [Column] 或 [DatabaseGenerated] 这类数据注解来声明影子属性,EF Core 明确禁止。必须在 OnModelCreating 里用 Property<t>("PropertyName")</t> 显式配置:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property<DateTime>("LastUpdated")
        .HasDefaultValueSql("GETUTCDATE()");
<pre class="brush:php;toolbar:false;">modelBuilder.Entity<Post>()
    .Property<bool>("IsDeleted")
    .HasDefaultValue(false);

}

  • 字符串名 "LastUpdated" 不校验是否存在于 Blog 类中——哪怕你真写了同名字段,EF Core 也会把它当影子属性覆盖(除非你明确用 HasColumnName 指向物理列)
  • 类型 <datetime></datetime> 必须和数据库列类型兼容;SQL Server 的 DATETIME2 对应 DateTime,PostgreSQL 的 TIMESTAMP WITH TIME ZONE 则建议用 DateTimeOffset
  • 没设默认值或生成策略时,插入新记录会报错(如 NOT NULL 列无值),所以通常要配 HasDefaultValue 或 ValueGeneratedOnAddOrUpdate

怎么读写影子属性?不能点出来,得靠 ChangeTracker 和 EF.Property

你写 blog.LastUpdated 会编译失败——它根本不是 Blog 的成员。所有操作都依赖实体是否被上下文追踪(tracked):

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 写入(新增/更新时):context.Entry(blog).Property("LastUpdated").CurrentValue = DateTime.UtcNow;
  • 查询中排序:context.Blogs.OrderBy(b => EF.Property<datetime>(b, "LastUpdated"))</datetime>
  • 加载后取值:var time = context.Entry(blog).Property("LastUpdated").CurrentValue;
  • 注意:EF.Property 只能在 LINQ 查询中用(生成 SQL),不能在内存集合上调用,否则抛 InvalidOperationException

哪些场景适合用影子属性?别为了炫技而用

影子属性不是语法糖,它是有明确设计意图的“隐藏状态容器”:

  • 审计字段:如 CreatedBy、CreatedAt,业务层不该改、也不该暴露给 API —— 影子属性配合拦截器(SaveChanges 重写)刚好闭环
  • 软删除标记:IsDeleted 存库但不进 DTO,再配合全局查询过滤器(HasQueryFilter)自动剔除
  • 外键列:当你只用导航属性(public Blog Blog { get; set; })却不想要 public int BlogId { get; set; } 字段时,EF Core 默认就创建了 BlogId 影子外键
  • 临时业务标记:比如后台任务需要打标 _ProcessingLock,仅用于数据库行锁,完全不参与领域逻辑

容易踩的坑:值丢了、查不到、迁移失败

影子属性最常出问题的地方不是不会写,而是忘了它“只活在 ChangeTracker 里”:

  • 用 AsNoTracking() 查询后,Entry(x).Property("X").CurrentValue 返回 null 或默认值——因为没被追踪
  • 迁移脚本里没生成对应列?检查是否漏了 .Property<t>("Name")</t>,或者类型不匹配导致 EF Core 忽略了该配置
  • 用 context.Blogs.FromSqlRaw(...) 手写 SQL 查询时,影子属性值不会自动填充——除非你在 SQL 里显式 SELECT 出来并映射
  • 并发更新冲突检测(ConcurrencyCheck)不能直接加在影子属性上,得先用 IsRowVersion() 或手动设 IsConcurrencyToken()

影子属性真正难的不是语法,而是时刻记住:它没有 C# 字段支撑,所有访问都绕不开 EF Core 的生命周期和变更追踪机制。一旦脱离上下文或误用查询方式,值就“凭空消失”。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4843

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

991

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1269

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6861

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3563

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6860

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

9521

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1290

2024.04.29

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn