Entity Framework自引用实体配置错误:InvalidOperationException求助
嘿,我刚遇到一模一样的问题,来给你捋清楚怎么修!我尝试把Organization实体的RemappedOrganization字段映射到数据库的Organization.Recno字段时,操作对象直接抛出了这个错误:
InvalidOperationException: Cannot call Property for the property 'RemappedOrganization' on entity type 'Organization' because it is configured as a navigation property. Property can only be used to configure scalar properties.
问题根源
你这里的核心问题是**ForeignKey属性的使用位置错了**!RemappedOrganization是一个导航属性(用来表示实体之间的关联关系,比如自关联的上级组织),而ForeignKey特性应该标注在对应的外键标量属性上,不是导航属性本身。而且你现在的代码里没有显式定义外键字段,EF虽然会自动生成,但你想手动映射的思路也搞错了——Recno是当前实体的主键,不能把外键也绑定到同一个字段,这会导致冲突,你需要一个单独的外键字段来存储关联的上级组织的Recno。
修正方案
下面给你两种可行的修正方式:
方式一:使用DataAnnotations特性修正实体类
显式定义外键字段,然后把ForeignKey标注在导航属性上指向这个外键字段:
public class Organization { [Key] public int? Recno { get; set; } public string OrganizationName { get; set; } public bool PermanentlyDisplay { get; set; } // 新增外键标量属性,用来存储关联的组织Recno public int? RemappedOrganizationRecno { get; set; } // 用ForeignKey指定这个导航属性对应的外键字段 [ForeignKey(nameof(RemappedOrganizationRecno))] public virtual Organization RemappedOrganization { get; set; } public DateTime? DateAdded { get; set; } }
方式二:使用Fluent API配置(不修改实体类的情况下)
如果不想改动实体类的结构,可以在OnModelCreating里用Fluent API来配置自关联关系:
modelBuilder.Entity<Organization>() .ToTable("Organization") .HasIndex(p => new { p.OrganizationName }).IsUnique(); // 配置自关联的导航属性与外键 modelBuilder.Entity<Organization>() .HasOne(o => o.RemappedOrganization) // 当前实体的导航属性 .WithMany() // 如果没有反向导航属性(比如下级组织集合)就留空,有的话填对应的属性名 .HasForeignKey("RemappedOrganizationRecno") // 数据库中的外键列名,或者实体类中的字段名 .IsRequired(false); // 因为外键是int?,所以设置为可选
额外说明
不管用哪种方式,数据库里都会生成一个RemappedOrganizationRecno字段(或者你指定的其他名称),用来存储当前组织关联的上级组织的Recno值。之前的错误就是因为你把导航属性当成了标量字段来配置,EF无法识别这种操作,所以抛出了异常。
内容的提问来源于stack exchange,提问作者James Huang

