.NET 3.1中如何为新增列设置默认值(新旧数据均生效)
问题
使用.NET 3.1,现有实体类:
public class Addresses { public int AddressID { get; set; } public string Name { get; set; } }
需新增一列,修改后实体类:
public class Addresses { public int AddressID { get; set; } public string Name { get; set; } public bool IsAddrLocal { get; set; } }
需求:
- 数据库中已有数据行的
IsAddrLocal默认值为True - 新插入的数据默认设为
True,但允许后续手动更新为False
尝试过三种方法均不符合需求:
- 在
OnModelCreating中配置HasDefaultValue(true),但无法手动将值设为False(原代码中实体名写错为CompanyShippingAddress,应为Addresses)
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Addresses>(entity => { entity.Property(x => x.IsAddrLocal).HasDefaultValue(true); }); }
- 将字段设为可空
bool? IsAddrLocal,但旧数据行该字段值为NULL,仅新数据为True - 改回非空字段并添加构造函数初始化
IsAddrLocal = true,但旧数据行该字段值变为False,仅新数据为True
解决方案
要同时满足旧数据默认True、新数据默认True且可手动修改,需要结合EF Core迁移和模型配置两步操作:
步骤1:添加实体字段并生成初始迁移
确保实体类已添加非空的IsAddrLocal字段,然后在命令行执行生成迁移的命令:
Add-Migration AddIsAddrLocalToAddresses
步骤2:修改迁移文件
打开项目Migrations文件夹下生成的迁移文件,调整Up方法代码:
- 添加列时指定数据库默认值为
true - 新增SQL语句将现有数据的
IsAddrLocal批量更新为True
修改后的Up方法示例:
protected override void Up(MigrationBuilder migrationBuilder) { // 添加列并设置数据库默认值为true migrationBuilder.AddColumn<bool>( name: "IsAddrLocal", table: "Addresses", nullable: false, defaultValue: true); // 更新已有数据的IsAddrLocal为true migrationBuilder.Sql("UPDATE Addresses SET IsAddrLocal = 1;"); }
步骤3:正确配置模型
在OnModelCreating中配置字段默认值,该配置仅控制新插入数据的默认行为,不限制手动修改:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Addresses>(entity => { entity.Property(x => x.IsAddrLocal) .HasDefaultValue(true); }); }
步骤4:应用迁移
执行命令将迁移应用到数据库:
Update-Database
完成后:
- 现有数据的
IsAddrLocal全部被更新为True - 新插入的数据默认
IsAddrLocal为True - 后续可正常将任意行的
IsAddrLocal更新为False
内容的提问来源于stack exchange,提问作者Selim Choueiter
相关产品推荐
相关产品推荐

