EF Core执行Add-Migration时外键属性无法移除报错咨询
错误原因
这是Entity Framework Core的外键映射约定和代码注解配置冲突导致的:
- 你在
CartItem中给CartRefId属性加了[ForeignKey("Cart")]注解,声明这个字段是指向名为Cart的导航属性的外键,但你实际写的导航属性名是CartId(类型为Cart),类中根本不存在名为Cart的导航属性,注解配置首先就失效了。 - EF Core按照默认约定,会给名为
CartId的导航属性自动匹配同名的外键字段,也就是它会默认认为CartItem上应该有一个字符串类型的CartId属性当外键,但你代码里的CartId是个引用导航属性,不是外键字段。迁移生成过程中EF尝试移除它按约定虚拟出来的CartId外键属性时,发现这个属性还被自动生成的外键约束依赖,就抛出了对应错误。
修复方案
核心是把导航属性和外键的映射关系配对,最规范的写法如下:
public class Cart { [Key] public string CartId { get; set; } public List<CartItem> CartItems { get; set; } } public class CartItem { [Key] public string CartItemId { get; set; } public Product Product { get; set; } [ForeignKey("Cart")] // 这里填的是下方导航属性的名称 public string CartRefId { get; set; } // 导航属性名和ForeignKey注解中声明的名称保持一致,不要和外键字段/主实体主键重名引发混淆 public Cart Cart { get; set; } }
如果你坚持要把导航属性命名为CartId,就把ForeignKey注解挪到导航属性上,明确指定它对应的外键字段名即可:
public class CartItem { [Key] public string CartItemId { get; set; } public Product Product { get; set; } public string CartRefId { get; set; } [ForeignKey("CartRefId")] // 这里填的是上方外键字段的名称 public Cart CartId { get; set; } }
改完代码后,先删除之前执行失败生成的残次迁移文件,再重新运行Add-Migration命令就能正常生成迁移脚本了。
内容的提问来源于stack exchange,提问作者user18503490
相关产品推荐
相关产品推荐

