EF Core 7 Code-First模式同表外键引用主键的正确配置方式
自引用外键的正确配置方式(EF Core/EF6)
你的问题出在缺少对应的导航属性,单独使用[ForeignKey]注解无法让EF识别自引用关联关系,必须配合导航属性一起配置。以下是两种可行的配置方案:
一、数据注解方式
需要在类中添加导航属性,然后通过[ForeignKey]关联外键属性和导航属性:
public partial class CCSSubCuenta { [Key] [Required] [MaxLength(6)] [Column("SCTA_CLAVE", TypeName = "decimal(6)")] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public decimal SctaClave { get; set; } // 外键属性,关联到自身的SctaClave [MaxLength(6)] [Column("SCTA_CLAVE_SCTA_MAESTRA", TypeName = "decimal(6)")] [ForeignKey("SctaMaestra")] // 指定对应的导航属性 public decimal? SctaClaveSctaMaestra { get; set; } // 导航属性:指向父账户 public CCSSubCuenta SctaMaestra { get; set; } // 可选:导航属性:指向当前账户下的所有子账户 public ICollection<CCSSubCuenta> SubCuentas { get; set; } }
也可以把[ForeignKey]标注在导航属性上,效果一致:
// 外键属性去掉[ForeignKey] [MaxLength(6)] [Column("SCTA_CLAVE_SCTA_MAESTRA", TypeName = "decimal(6)")] public decimal? SctaClaveSctaMaestra { get; set; } // 导航属性上标注外键属性名 [ForeignKey("SctaClaveSctaMaestra")] public CCSSubCuenta SctaMaestra { get; set; }
二、Fluent API方式
如果更倾向于在DbContext中集中配置,可使用Fluent API,这种方式不需要在实体类中添加注解,灵活性更高:
public class YourDbContext : DbContext { public DbSet<CCSSubCuenta> CCSSubCuentas { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<CCSSubCuenta>(entity => { // 配置主键 entity.HasKey(e => e.SctaClave); entity.Property(e => e.SctaClave) .HasMaxLength(6) .HasColumnType("decimal(6)") .ValueGeneratedOnAdd(); // 配置自引用外键 entity.HasOne(e => e.SctaMaestra) // 父导航属性 .WithMany(e => e.SubCuentas) // 子集合导航属性 .HasForeignKey(e => e.SctaClaveSctaMaestra) // 外键属性 .OnDelete(DeleteBehavior.Restrict); // 禁止级联删除,避免循环删除问题 }); } }
注意:自引用关系必须禁用级联删除(DeleteBehavior.Restrict或DeleteBehavior.NoAction),否则数据库会因为循环依赖报错。
内容的提问来源于stack exchange,提问作者ISeeMangos
相关产品推荐
相关产品推荐

