Entity Framework 6.2关联列命名异常求助:列名自动添加重复后缀
解决EF6.2中关联列名自动添加重复后缀的问题
这个问题我之前也碰到过,EF6的默认约定在这里有点坑——你把导航属性命名成了StudentId和ScholarshipId,但这些是引用类型(对应Student/Scholarship实体),EF会默认把外键列名生成「导航属性名_关联实体的主键名」,所以才会出现StudentId_StudentId这种重复后缀的列名。下面给你两种靠谱的解决方法:
方法一:用数据注解显式声明外键
修改你的SS2实体类,新增对应的int类型外键字段,然后通过[ForeignKey]特性关联导航属性,同时把列名配置移到外键字段上:
public class SS2 { [Column(Order = 1)] public int SS2ID { get; set; } // 新增int类型外键字段,指定列名和排序 [Required] [Column("StudentId", Order = 2)] public int StudentId { get; set; } // 导航属性,用ForeignKey关联上面的外键字段 [ForeignKey("StudentId")] public Student Student { get; set; } // 同样处理Scholarship关联 [Required] [Column("ScholarshipId", Order = 3)] public int ScholarshipId { get; set; } [ForeignKey("ScholarshipId")] public Scholarship Scholarship { get; set; } }
这样EF就会明确把StudentId和ScholarshipId作为外键列,不会自动生成带后缀的名称了。另外建议把导航属性命名为Student/Scholarship(而非StudentId/ScholarshipId),这样更符合EF的命名约定,也能避免字段和导航属性重名带来的混淆。
方法二:用Fluent API配置(无需修改实体类)
如果不想改动实体类结构,可以在你的DbContext中重写OnModelCreating方法,手动配置关联关系和外键列名:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 配置SS2与Student的关联,指定外键列名为StudentId modelBuilder.Entity<SS2>() .HasRequired(s => s.StudentId) .WithMany() // 如果Student实体有反向导航属性,这里填对应的属性名,比如.WithMany(stu => stu.SS2s) .Map(m => m.MapKey("StudentId")); // 配置SS2与Scholarship的关联,指定外键列名为ScholarshipId modelBuilder.Entity<SS2>() .HasRequired(s => s.ScholarshipId) .WithMany() .Map(m => m.MapKey("ScholarshipId")); }
内容的提问来源于stack exchange,提问作者done_merson
相关产品推荐
相关产品推荐

