.NET 5升级至.NET 6后Add-Migration报错:CustomAttributeData需定义主键
问题解决:.NET6升级后Add-Migration报错CustomAttributeData需主键
问题根源
你遇到的问题是EF Core的模型发现机制在.NET6中的行为变化导致的:当CustomFields实体包含Type类型的PropertyType属性时,EF会自动遍历Type类的成员,发现其CustomAttributes属性返回的CustomAttributeData类型,并试图将其纳入实体模型。但CustomAttributeData是系统类型,没有定义主键,因此触发验证错误。
解决方案
提供两种可行的解决方式,按优先级推荐:
1. 配置Type属性的字符串转换(推荐)
将Type类型转换为字符串存储(使用类型的程序集限定名),这样EF不会尝试解析Type的内部导航属性,从根源避免问题。在你的DbContext的OnModelCreating方法中添加配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<CustomFields>() .Property(f => f.PropertyType) .HasConversion( type => type.AssemblyQualifiedName, typeName => Type.GetType(typeName)); }
这种方式同时解决了EF模型发现问题,还让Type类型的存储更稳定(直接序列化Type可能存在兼容性问题)。
2. 显式忽略CustomAttributeData类型
如果暂时不想修改Type的存储方式,可直接告诉EF不要将CustomAttributeData纳入模型:
protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Ignore<CustomAttributeData>(); }
验证方式
添加上述配置后,重新执行Add-Migration命令,即可正常生成迁移文件。
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

