ASP.NET Core已搭建基架的现有数据库表更新报错问题
问题根因
- 新增字段未被迁移检测到的核心原因:你定义的
NombreCotizacion是类的公共字段,没有声明get;set访问器。EF Core默认只会映射实体中带访问器的公共属性,普通字段不会被识别为需要映射的表结构,因此执行迁移时判定无结构变更。 - 手动创建迁移报
There is already an object named 'AspNetRoles' in the database错误的原因:手动生成空迁移时,EF的模型快照和实际数据库状态不匹配,生成的迁移脚本包含了首次搭建时创建Identity系统相关表(AspNetRoles、AspNetUsers等)的逻辑,但这些表在数据库中早已存在,执行时重复创建就会触发报错。
修复步骤
- 首先修正Cotizaciones类的新字段定义,将普通字段改为EF可识别的公共属性,默认值迁移到构造函数中赋值,修正后的相关代码如下:
public partial class Cotizaciones { private static Random rnd = new Random(); public Cotizaciones() { DetalleProductoPersonalizados = new HashSet<DetalleProductoPersonalizado>(); // 新属性默认值放在构造函数中赋值 NombreCotizacion = GenerateLetter(); } // 省略原有其他属性... [Column(TypeName = "nvarchar(max)")] // 必须添加get;set访问器,EF才能识别为映射属性 public string? NombreCotizacion { get; set; } // 省略原有其他方法、导航属性... }
- 删除之前手动创建的错误迁移文件,包括迁移主类文件、对应的
.Designer.cs快照文件。 - 执行迁移生成命令,重新生成正确的迁移脚本:
Add-Migration Add_NombreCotizacion_To_Cotizaciones
此时EF会正确识别到Cotizaciones表的新增字段,生成的迁移文件仅包含新增列的逻辑,不会重复包含创建已存在表的代码。
- 执行数据库更新命令应用迁移:
Update-Database
命令执行完成后新字段就会同步到数据库中,不会触发重复建表的报错。
如果重新生成迁移时仍然出现重复创建已存在表的逻辑,说明迁移基线和数据库状态不同步,可以先执行一次空迁移对齐状态:
Add-Migration InitialBaseline -IgnoreChanges Update-Database该操作会生成一个无结构变更的空迁移,将EF的模型快照与当前数据库实际状态对齐,后续再新增迁移就不会出现重复建表的问题。
内容的提问来源于stack exchange,提问作者Ruben Ferreira
相关产品推荐
相关产品推荐

