You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5升级至.NET 7后Add-Migration生成文件异常问题咨询

问题描述

近期将项目从.NET 5升级至.NET 7,执行add-migration nameofmychanges命令时,未做任何业务变更却出现大量自动生成的修改:

  • 自动生成的ContextModelSnapshot.cs文件顶部新增了#nullable disable,同时大量实体被设置为nullable:false且default:0;
  • 存在两类代码结构变更:
    示例一:
    原代码:
    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int")
                        .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
    
    变更后代码:
    b.Property<int>("Id")
                        .ValueGeneratedOnAdd()
                        .HasColumnType("int");
    
                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
    
    示例二:
    原代码:
    b.HasOne("EFDataAccessLayer.Entities.User", "CreatedBy")
                        .WithMany()
                        .HasForeignKey("CreatedById");
    
    变更后代码:
    b.HasOne("EFDataAccessLayer.Entities.User", "CreatedBy")
                        .WithMany()
                        .HasForeignKey("CreatedById")
                        .OnDelete(DeleteBehavior.Cascade)
                        .IsRequired();
    

咨询两个问题:

  1. 如何阻止#nullable disable自动添加到ContextModelSnapshot.cs文件中?
  2. 上述两类代码变更在.NET 5升级至.NET 7过程中是否属于正常现象?背后原因是什么?

问题解答

1. 阻止#nullable disable自动添加到ContextModelSnapshot.cs

EF Core 7.0默认会为自动生成的快照文件添加#nullable disable指令,要禁用这个行为,在项目的.csproj文件中添加以下配置即可:

<PropertyGroup>
  <EfCoreSnapshotNullableDisable>false</EfCoreSnapshotNullableDisable>
</PropertyGroup>

添加完成后重新生成项目,后续创建迁移时就不会自动在快照文件中添加该指令。

2. 两类代码变更的正常性及原因

这两类变更都属于.NET 5升级到.NET 7时的正常现象,背后原因是EF Core 7.0的API规范化调整:

示例一的变更

EF Core 7.0对SQL Server身份列的配置方式做了优化,将原来通过HasAnnotation设置身份策略的写法,替换为更直观的UseIdentityColumn扩展方法。这种调整只是让代码可读性更强、API更具针对性,底层功能逻辑没有变化。

示例二的变更

EF Core 7.0调整了外键关联的默认行为展示:

  • 对于非可空外键(比如CreatedById是int类型,默认非可空),新版本会显式生成.IsRequired(),而旧版本是隐式处理;
  • .OnDelete(DeleteBehavior.Cascade)是因为非可空外键的默认删除行为就是级联删除,旧版本不会在快照中写出,7.0版本改为显式生成,确保代码和实际行为一致,避免歧义。

这些变更不会影响数据库的实际结构和业务逻辑,只是迁移文件和快照的代码写法更符合新版本的规范。


内容的提问来源于stack exchange,提问作者Michael Winther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:20:15