EF Core一对多关联插入报错:无效列名'TblDocumentDataId'
问题原因及解决方案
核心问题
你在双向配置一对多关系时出现了配置冲突:
- 在
LinkedDocument的Fluent配置中,HasOne(d => d.Document).WithMany()未指定对应TblDocumentData中的LinkedDocuments集合导航属性; - 而
TblDocumentData的配置里,HasMany(d => d.LinkedDocuments).WithOne(d => d.Document)又明确指定了反向导航。
这种不一致的配置让EF Core误判存在两个独立关联关系,因此自动生成了多余的外键列TblDocumentDataId。
解决方案
只需统一关联关系配置,两种方式二选一即可:
方式一:修正LinkedDocument的Fluent配置
在WithMany()中指定对应的集合导航属性,保持双向配置一致:
modelBuilder.Entity<LinkedDocument>( entity => { entity.ToTable("LinkedDocument"); entity.HasKey(e => new {e.Id, e.DocumentId}) .HasName("PK_LinkedDocument") .IsClustered(false); entity.Property(e => e.Id).ValueGeneratedNever(); // 关键修改:指定TblDocumentData的LinkedDocuments集合 entity.HasOne(d => d.Document) .WithMany(d => d.LinkedDocuments) .HasForeignKey(d => d.DocumentId) .HasConstraintName("FK_LinkedDocument_TBL_DocumentData_DocumentId") .IsRequired() .OnDelete(DeleteBehavior.Cascade); });
方式二:移除TblDocumentData的重复配置
由于已在LinkedDocument的配置中定义了关联关系,可删除TblDocumentData里的这段重复配置:
// 删除以下重复配置 // entity.HasMany(d => d.LinkedDocuments) // .WithOne(d => d.Document) // .HasForeignKey(d => d.DocumentId) // .IsRequired();
验证效果
修改后重新运行保存代码,EF Core会正确使用你定义的DocumentId作为外键列,不会再生成多余的TblDocumentDataId。
内容的提问来源于stack exchange,提问作者demo
相关产品推荐
相关产品推荐

