.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();
咨询两个问题:
- 如何阻止
#nullable disable自动添加到ContextModelSnapshot.cs文件中? - 上述两类代码变更在.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
相关产品推荐
相关产品推荐

