Entity Framework 6.0中外键作为复合主键的实现方法求助
没问题,我来帮你搞定EF6里这种「复合主键包含外键」的场景!咱们先把你的实体类语法修正一下(毕竟大小写和拼写准确才能正常运行),然后分两种常用的配置方式来实现:
方法一:使用Data Annotations(数据注解)
这种方式直接在实体类上添加特性,简单直观。你需要给复合主键的每个属性标记[Key]和[Column(Order = n)]来指定主键顺序,同时用[ForeignKey]关联主表:
public class Primary_Class { // 主表的单一主键 public int pkey { get; set; } public string Misc { get; set; } } public class dependent_Class { // 复合主键的第一列 [Key] [Column(Order = 0)] public int dkey { get; set; } // 复合主键的第二列,同时是关联主表的外键 [Key] [Column(Order = 1)] [ForeignKey(nameof(Primary_Class))] public int pkey { get; set; } public string data { get; set; } // 导航属性(可选,但建议添加,方便跨表查询) public virtual Primary_Class PrimaryClass { get; set; } }
这里的[Column(Order)]决定了数据库中复合主键的排序,[ForeignKey]明确了这个属性是关联Primary_Class的外键字段。
方法二:使用Fluent API(更灵活的配置方式)
如果不想在实体类上写太多特性,可以把配置集中在DbContext的OnModelCreating方法里,适合复杂的映射场景:
首先是干净的实体类(不需要额外特性):
public class Primary_Class { public int pkey { get; set; } public string Misc { get; set; } // 主表的导航属性(可选,对应依赖表的集合) public virtual ICollection<dependent_Class> DependentClasses { get; set; } } public class dependent_Class { public int dkey { get; set; } public int pkey { get; set; } public string data { get; set; } // 依赖表的导航属性,关联主表 public virtual Primary_Class PrimaryClass { get; set; } }
然后在你的DbContext里配置映射规则:
public class YourDbContext : DbContext { public DbSet<Primary_Class> PrimaryClasses { get; set; } public DbSet<dependent_Class> DependentClasses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 配置主表的主键 modelBuilder.Entity<Primary_Class>() .HasKey(p => p.pkey); // 配置依赖表的复合主键(顺序对应数据库中的主键排序) modelBuilder.Entity<dependent_Class>() .HasKey(d => new { d.dkey, d.pkey }); // 配置外键关联:依赖表的pkey字段关联主表的pkey字段 modelBuilder.Entity<dependent_Class>() .HasRequired(d => d.PrimaryClass) // 如果外键是必填项用HasRequired,可选则用HasOptional .WithMany(p => p.DependentClasses) // 主表对应多个依赖表记录,一对一场景用WithRequiredPrincipal .HasForeignKey(d => d.pkey); } }
Fluent API的优势是把所有映射规则集中管理,实体类保持简洁,后期修改配置也更方便。
不管用哪种方式,EF6都会根据你的配置自动生成对应的数据库表结构:依赖表会创建(dkey, pkey)的复合主键,同时pkey字段会被设置为关联主表的外键约束。
内容的提问来源于stack exchange,提问作者Jayesh Agrawal
相关产品推荐
相关产品推荐

