首先使用EF代码映射组合键

sql server表:

SomeId PK varchar(50) not null OtherId PK int not null 

我应该如何将它映射到EF 6代码中?

 public class MyTable { [Key] public string SomeId { get; set; } [Key] public int OtherId { get; set; } } 

我已经看到一些例子,你必须设置每个列的顺序,是必需的?

这个地方有官方文档吗?

你肯定需要把列顺序,否则SQL Server应该知道哪一个先行? 以下是您需要在代码中执行的操作:

 public class MyTable { [Key, Column(Order = 0)] public string SomeId { get; set; } [Key, Column(Order = 1)] public int OtherId { get; set; } } 

你也可以看看这个问题 。 如果你想要正式的文件,我会build议看一下英文官方网站 。 希望这可以帮助。

编辑:我刚刚发现从朱莉勒曼的博客文章链接到各种EF 6善良。 你可以在这里find你需要的东西 。

对于使用entity framework映射复合主键,我们可以使用两种方法。

1) 通过重写OnModelCreating()方法

例如:我有一个名为VehicleFeature的模型类,如下所示。

 public class VehicleFeature { public int VehicleId { get; set; } public int FeatureId{get;set;} public Vehicle Vehicle{get;set;} public Feature Feature{get;set;} } 

我的DBContext中的代码将是,

 public class VegaDbContext : DbContext { public DbSet<Make> Makes{get;set;} public DbSet<Feature> Features{get;set;} public VegaDbContext(DbContextOptions<VegaDbContext> options):base(options) { } // we override the OnModelCreating method here. protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<VehicleFeature>().HasKey(vf=> new {vf.VehicleId, vf.FeatureId}); } } 

2) 通过数据注释。

 public class VehicleFeature { [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] public int VehicleId { get; set; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key] public int FeatureId{get;set;} public Vehicle Vehicle{get;set;} public Feature Feature{get;set;} } 

请参阅下面的链接了解更多信息。

1) https://msdn.microsoft.com/en-us/library/jj591617(v=vs.113 ) .aspx

2) 如何使用EF 6 Fluent Api添加复合唯一密钥?

通过configuration,你可以这样做:

 Model1 { int fk_one, int fk_two } Model2 { int pk_one, int pk_two, } 

然后在上下文configuration

 public class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Model1>() .HasRequired(e => e.Model2) .WithMany(e => e.Model1s) .HasForeignKey(e => new { e.fk_one, e.fk_two }) .WillCascadeOnDelete(false); } }