首页
/ EF Core 9.0 中时间戳列与临时表的兼容性问题解析

EF Core 9.0 中时间戳列与临时表的兼容性问题解析

2025-05-15 11:45:45作者:齐添朝

问题背景

在 EF Core 9.0 版本中,开发者在将现有数据库升级时遇到了一个关于时间戳列(rowversion)与临时表(temporal tables)的兼容性问题。这个问题特别出现在同时使用了乐观并发控制和时间戳功能的场景中。

技术细节

乐观并发控制与时间戳

乐观并发控制是 EF Core 提供的一种并发处理机制,通过在实体类中添加一个 [Timestamp] 标记的 byte[] 类型属性来实现。这个属性会被映射到 SQL Server 的 rowversion 数据类型(也称为 timestamp),它是一个自动递增的二进制数值,每次行更新时都会自动改变。

临时表功能

临时表是 SQL Server 提供的一项功能,可以自动跟踪和记录表中数据的历史变化。EF Core 从 7.0 版本开始支持临时表功能,通过简单的注解就能启用。

问题表现

在 EF Core 9.0 中,当开发者尝试以下操作时会遇到问题:

  1. 首先创建一个包含 rowversion 列的迁移
  2. 然后创建一个将该表转换为临时表的迁移

具体错误表现为:Cannot alter column 'Version' to be data type timestamp,即无法将列修改为时间戳类型。

问题原因

这个问题源于 EF Core 9.0 中临时表迁移逻辑的一个缺陷。当尝试将现有表转换为临时表时,EF Core 会生成一个包含 ALTER COLUMN 语句的迁移,试图修改 rowversion 列。然而在 SQL Server 中,rowversion 列一旦创建就不能被修改。

解决方案

目前微软团队已经确认这是一个已知问题,并将在 EF Core 9.0.2 版本中修复。在此之前,开发者可以采用以下临时解决方案:

  1. 手动编辑迁移文件,移除对 rowversion 列的修改操作
  2. 或者暂时回退到 EF Core 8.0 版本

最佳实践建议

对于需要使用乐观并发控制和临时表功能的项目,建议:

  1. 先在 EF Core 8.0 中完成所有迁移的创建和应用
  2. 然后再升级到 EF Core 9.0
  3. 等待 9.0.2 版本发布后再进行新的迁移操作

总结

这个问题展示了数据库迁移中类型系统兼容性的复杂性。开发者在升级 EF Core 版本时,特别是涉及到底层数据库类型系统的变更时,需要特别注意测试迁移脚本的兼容性。微软团队已经意识到这个问题,并将在后续版本中提供修复。

登录后查看全文
热门项目推荐
相关项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
176
262
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
863
511
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
93
15
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
129
182
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
259
300
kernelkernel
deepin linux kernel
C
22
5
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
596
57
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.07 K
0
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
398
371
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
332
1.08 K