首先使用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); } }