你能用DbModelBuilder声明一个复合主键吗?

时间:2016-02-09 20:30:33

标签: c# entity-framework

我的数据库中有一个表,其中包含由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中处理复合主键的可接受方式吗?

1 个答案:

答案 0 :(得分:1)

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

for(i in 001:638){ 
#command for plot comes here, including mentioning of i ##
dev.copy(png,paste("plot",i,".png", sep = ""))
dev.off()

键的顺序将按照您定义的顺序排列,因此myTableEntity.HasKey(f => new { f.foo, f.bar}); 在此处为order = 0,而foo将为order = 1.

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

bar