是否可以使用 DbModelBuilder 声明复合主键

本文关键字:复合 声明 DbModelBuilder 可以使 是否 | 更新日期: 2023-09-27 18:33:59

我的数据库中有一个表,其中包含由foo和bar组成的复合主键。如果我这样做

private static void EfMapMyTableAdded(DbModelBuilder modelBuilder)
{
     var myTableEntity = modelBuilder.Entity<MyTable>();
     myTableEntity.ToTable("myTable");
     myTableEntity.HasKey(f => f.foo)
         .Property(f => f.foo)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

并有

foo bar val
1   1   5
1   2   6

我更新第一条记录的值为 7,它也将更新第二条记录。但是如果我使用

private static void EfMapMyTableAdded(DbModelBuilder modelBuilder)
{
     var myTableEntity = modelBuilder.Entity<MyTable>();
     myTableEntity.ToTable("myTable");
     myTableEntity.HasKey(f => f.foo)
         .Property(f => f.foo)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
     myTableEntity.HasKey(b => b.bar)
         .Property(b => b.bar)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}

它更新仅更新第一行,这就是我想要的。这是处理 EF 中复合主键的可接受方法吗?

是否可以使用 DbModelBuilder 声明复合主键

要声明组合键,您需要使用匿名投影:

myTableEntity.HasKey(f => new { f.foo, f.bar});

键的顺序将按照您定义它们的顺序排列,因此foo此处为 order=0,bar 为 order=1。

另一种选择是使用数据注释:

public class myTableEntity
{   
    [Key, Column(Order=0)]
    public int foo {get; set;}
    [Key, Column(Order=1)]
    public int bar {get; set;}
}