EF Core 3.1 逆向脚手架未排除时态表HIDDEN列的问题咨询
行为变更的实际背景
- EF Core 2.1对SQL Server时态表的支持属于早期实验性适配,当时的逆向脚手架逻辑是临时硬编码实现的:只要识别到时态表关联的周期列,不管其属性如何都会直接跳过映射,恰好匹配了你当时对
HIDDEN列被忽略的预期。 - 从EF Core 3.0开始,团队重构了SQL Server提供程序对时态表的原生正式支持,相关调整没有被纳入升级文档的破坏性变更列表:新的脚手架逻辑不再因为列带
HIDDEN标记就做排除,而是会主动把PERIOD FOR SYSTEM_TIME定义的两个周期列(即ValidFromUtc、ValidTillUtc)纳入实体映射范围。- 本质上SQL Server的列
HIDDEN属性,仅用于控制SELECT *查询时的列返回行为,本身不是定义“ORM映射时需要排除”的数据库级标记。EF Core 3.0之后的设计选择是:既然这两个列是时态表系统版本周期的核心组成部分,就默认将其纳入模型配置,不再跟随HIDDEN标记做自动排除。 - 你没有在升级文档里找到对应说明的原因是,团队把这个变更归类为正式支持时态表的配套调整,没有将2.1版本的临时跳过逻辑认定为“预期正确行为”,因此没有将其标记为破坏性变更。
- 本质上SQL Server的列
现有适配方案
- 无需每次脚手架操作完成后手动删除生成的多余配置,可以通过自定义逆向工程的T4模板,在生成阶段就过滤掉这两个时态周期列的映射代码,实现和EF Core 2.1版本一致的生成效果。
- 若不想自定义模板,也可以在生成的模型配置中手动移除这两个列的属性配置;只要EF Core不对这两个列做映射,SQL Server侧的系统版本机制会自动完成列值的赋值与维护,完全不影响时态表的正常读写功能。
- 补充说明:该设计逻辑从3.1版本延续到了后续所有EF Core正式版本,官方没有重新加入“自动跳过带
HIDDEN属性的时态周期列”的脚手架逻辑,默认行为就是将周期列纳入模型映射。
内容的提问来源于stack exchange,提问作者Christopher Townsend
相关产品推荐
相关产品推荐

