我的数据库中有一个表,其复合主键由 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 中复合主键的可接受方式吗?
最佳答案
要声明复合键,您需要使用匿名投影:
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;}
}
关于c# - 可以使用 DbModelBuilder 声明复合主键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35301589/