网易首页 > 网易号 > 正文 申请入驻

给默认约束起个名,为什么会让整个模型的下次迁移全变?

0
分享至

  EF Core 10 给 SQL Server 的默认约束(default constraint)带来了一个看似不起眼的新能力:给每个默认值起一个稳定的名字。这个能力解决的是数据库运维里一个很实际的痛点——以前 SQL Server 自动生成的名字长这样:DF__Jobs__Status__...,后面那串随机字符在脚本和故障处理手册里根本没法预测。

  但新功能有个容易踩的坑:如果你在已有的模型上启用这个命名约定,下一次迁移会把模型里每一个默认约束全部改一遍。这不是改一两个字段的小事,而是牵动整个表结构的批量变更。

  

  这种小配置改动,恰恰是最该在部署前加一道迁移闸门(migration gate)的场景。问题来了:到底会有多少列受影响?实际会执行什么 SQL?能不能不连真实数据库就把预览脚本拉出来看?

  两种命名方式,一个全局开关

  EF Core 10 为 SQL Server 的默认值提供了两种命名选择。第一种是直接在HasDefaultValueHasDefaultValueSql方法里传名字;第二种是启用全局约定,在OnModelCreating里加一行modelBuilder.UseNamedDefaultConstraints(),然后所有默认值都会自动获得可预测的名字。

  比如下面这段配置:

  protected override void OnModelCreating(ModelBuilder modelBuilder)modelBuilder.UseNamedDefaultConstraints();modelBuilder.Entity(entity =>entity.Property(job => job.Status).HasDefaultValue("queued");entity.Property(job => job.CreatedUtc).HasDefaultValueSql("SYSUTCDATETIME()");entity.Property(job => job.RetryCount).HasDefaultValue(0);

  生成的名字是DF_Jobs_StatusDF_Jobs_CreatedUtcDF_Jobs_RetryCount。这种可预测性在部署脚本、DBA 排查、回滚流程里非常有用——你不需要去数据库里查名字,直接按规则写就行。

  坑在哪儿:全局约定不是"只加不改"

  关键问题在于,这个全局调用对已有 schema 来说不是纯元数据操作。微软在 EF Core 10 的发布说明里明确警告:启用约定后,下一次迁移会重命名模型里所有默认约束

  如果构建流程只检查迁移能否编译通过,根本看不出这次改动的真实范围。编译通过 ≠ 影响面小,这是很多团队容易忽略的点。

  为了验证实际效果,我搭了一个可运行的示例项目,包含两个已提交的迁移。第一个InitialSchema代表旧模型,有三个未命名的默认约束;第二个NameDefaultConstraints是在添加全局约定后生成的。

  第二个迁移里发生了什么

  第二个迁移包含三个AlterColumn操作。每个操作保持相同的 CLR 类型和默认值,但新增了一个关系型注解(relational annotation),用来指定约束名:

  migrationBuilder.AlterColumn(name: "Status",table: "Jobs",type: "nvarchar(32)",maxLength: 32,nullable: false,defaultValue: "queued",oldClrType: typeof(string),oldType: "nvarchar(32)",oldMaxLength: 32,oldDefaultValue: "queued").Annotation("Relational:DefaultConstraintName","DF_Jobs_Status");

  也就是说,表面上只是加了个名字,但迁移系统会把它当成一次列结构变更来处理。三个字段就是三个AlterColumn,字段越多,迁移脚本越长,部署窗口的风险也越大。

  不连数据库也能看预览 SQL

  好消息是,生成迁移脚本不需要实时数据库连接。SQL Server provider 可以在本地直接翻译已提交的迁移操作。用这几条命令就能拿到预览:

  dotnet tool restoredotnet restoredotnet build -c Release --no-restoredotnet tool run dotnet-ef migrations script `InitialSchema NameDefaultConstraints `--no-build --configuration Release

  这个流程的核心价值在于:在部署之前,你就能看到完整的 SQL 变更内容,不需要把工具指向任何真实数据库。对于"启用命名约定会不会搞出大动静"这种问题,跑一遍脚本预览就能得到确切答案。

  我的判断:小改动,大影响,预览是底线

  正方观点:命名默认约束是长期收益,可预测的名字让运维脚本和故障排查省心不少,值得做。

  反方观点:一次迁移改动所有默认约束,风险面太大,尤其是生产环境表多、约束多的情况下,一个 AlterColumn 就可能触发锁表或长时间阻塞。

  我的判断是:功能本身没问题,但启用方式决定了风险等级。如果你在已有模型上直接开全局约定,务必先跑一遍迁移脚本预览,确认改动范围,再决定是分批处理还是接受一次性全量变更。对于新项目,从一开始就启用命名约定,完全不会有这个烦恼。

  EF Core 10 的这个特性,本质上是把"数据库对象名字可预测"这件事从手动约定变成了框架行为。但框架替你做的决定,你得先看清楚它到底改了什么。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
北大女博士凌晨订外送,骑手送到后留言:别开门拿

北大女博士凌晨订外送,骑手送到后留言:别开门拿

今天说故事
2025-08-02 10:07:53
1259人遇难后!尼泊尔向国际要赔偿,却对中国说不一样的话?

1259人遇难后!尼泊尔向国际要赔偿,却对中国说不一样的话?

李云飞Afey
2026-09-04 11:43:36
94岁原中央保健局局长王敏清:50年没感冒,无三高,靠的就是这几招

94岁原中央保健局局长王敏清:50年没感冒,无三高,靠的就是这几招

新浪财经
2026-06-24 02:28:33
泰媒更新世界女排名将身价榜!朱婷断层第一,稳居全球排坛顶流

泰媒更新世界女排名将身价榜!朱婷断层第一,稳居全球排坛顶流

金毛爱女排
2026-09-04 00:00:07
金正恩访问越南,乘专列耗时65小时40分,为什么不坐飞机?原来大有讲究

金正恩访问越南,乘专列耗时65小时40分,为什么不坐飞机?原来大有讲究

文史道
2026-08-15 23:01:48
回顾:江西男子中2.2亿大奖,3天后兑奖被要求出示文件,当场懵住

回顾:江西男子中2.2亿大奖,3天后兑奖被要求出示文件,当场懵住

今天说故事
2025-05-29 14:06:36
9100万用户流失!百度的搜索帝国,正在塌陷

9100万用户流失!百度的搜索帝国,正在塌陷

大佬灼见
2026-09-02 15:53:06
新旧“易中天”集体上涨,易点天下20CM涨停

新旧“易中天”集体上涨,易点天下20CM涨停

21世纪经济报道
2026-09-04 10:52:45
如此厉害?国足亚运阵容引日韩关注,韩媒:组建了一支顶级阵容

如此厉害?国足亚运阵容引日韩关注,韩媒:组建了一支顶级阵容

汪星人哟
2026-09-04 16:44:15
美国表态了!格里尔:美无意同中国达成一揽子协议,只想干一件事

美国表态了!格里尔:美无意同中国达成一揽子协议,只想干一件事

孤城落叶
2026-09-04 13:29:56
开局之年看中国·日新江淮|从“云”到“算”,宿州抢跑算力新赛道

开局之年看中国·日新江淮|从“云”到“算”,宿州抢跑算力新赛道

国际在线
2026-09-04 14:51:12
力挺偶像!34岁孙兴慜:C罗是历史最佳,我也无法反驳梅西是GOAT

力挺偶像!34岁孙兴慜:C罗是历史最佳,我也无法反驳梅西是GOAT

风过乡
2026-09-04 07:38:00
一觉醒来,特朗普闹出9个笑话,全世界哭笑不得

一觉醒来,特朗普闹出9个笑话,全世界哭笑不得

历史点行
2026-09-04 13:03:56
美国白宫网站上线抓捕移民游戏,网友直呼“太卑劣”

美国白宫网站上线抓捕移民游戏,网友直呼“太卑劣”

澎湃新闻
2026-09-04 16:44:31
有些单位烂透了。

有些单位烂透了。

老陆不老
2026-08-29 20:56:01
今日重点赛事!9月4日 CCTV5、CCTV5+ 体育赛事节目单,郑钦文 女篮

今日重点赛事!9月4日 CCTV5、CCTV5+ 体育赛事节目单,郑钦文 女篮

野渡舟山人
2026-09-04 08:14:00
一块电池跑84万公里容量仍88%,宁德时代把品质做成信任

一块电池跑84万公里容量仍88%,宁德时代把品质做成信任

闪存猎手
2026-09-03 19:47:25
中日发动机差距有多大?为何我国的挖掘机,都是用日本的发动机?

中日发动机差距有多大?为何我国的挖掘机,都是用日本的发动机?

莫地方
2026-08-18 22:21:24
孕肚明显!34岁超模路边摊买水果,二胎进入倒计时

孕肚明显!34岁超模路边摊买水果,二胎进入倒计时

时光慢旅人
2026-09-03 09:14:34
曝悉尼男子遭华男伴侣持锅殴打、滚水烫伤!“我以为自己要死了”

曝悉尼男子遭华男伴侣持锅殴打、滚水烫伤!“我以为自己要死了”

澳洲红领巾
2026-09-04 15:21:26
2026-09-04 21:15:00
固件更新中
固件更新中
有态度网友ytd
278文章数 71关注度
往期回顾 全部

科技要闻

OpenAI深夜王炸!GPT-6 Astra来了

头条要闻

来华交流的外国学生:这和我来之前想象的中国不一样

头条要闻

来华交流的外国学生:这和我来之前想象的中国不一样

体育要闻

小卡来去10首轮,快船7年彩礼一场空

娱乐要闻

古天乐公司欠债1.49亿

财经要闻

姚洋:刺激消费要守住两个“大西瓜”

汽车要闻

小米与中创新航、欣旺达动力达成战略合作

态度原创

艺术
家居
数码
房产
健康

艺术要闻

昔日“民营设计巨头”发文,对“停工停产”进一步说明

家居要闻

2026建博会(广州) 公装联探展交流活动

数码要闻

海信IFA2026发布AI伴侣套系:覆盖厨房、洗护、空气等核心场景

房产要闻

TOP10房企卖了350亿!海南楼市,最新榜单出炉!

脑梗取栓成功≠活下来,还有这三关

无障碍浏览 进入关怀版