如何在将类用作关系时创建复合(主)键

时间:2018-03-05 12:36:00

标签: c# entity-framework-core

如果我有:

class Checklist {
   [Key]
   public int ChecklistID {get;set;}
   public string Name {get;set;}
}

class ChecklistItem {
   [Key]
   public int ChecklistItemID {get;set;}
   public string Name {get;set;}
}

class ChecklistAndItem {
   public ChecklistItem ChecklistItem {get;set;}
   public Checklist Checklist {get;set;}
   String description {get;set;}
}

我想创建一个表,其中包含来自ChecklistItemID和ChecklistID的映射,用作复合主键。这有助于我防止重复。

OnModelCreating()中的正确映射是什么?

我试过了:

protected override void OnModelCreating(ModelBuilder modelBuilder) {

    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<ChecklistAndItem>()
        .HasKey(table => new {table.Checklist.ChecklistID,table.ChecklistItem.ChecklistItemID}
    );
}

但这给了我这个错误:

  

属性表达式
  'table => new <>f__AnonymousType0'2( ChecklistID = table.Checklist.ChecklistID, ChecklistItemID = table.ChecklistItem.ChecklistItemID )'无效   表达式应代表属性访问:'t => t.MyProperty'   指定多个属性时,请使用匿名类型:
     't => new { t.MyProperty1, t.MyProperty2 }'
  参数名称:propertyAccessExpression

1 个答案:

答案 0 :(得分:3)

这在EF6中是不可能的。幸运的是,EF Core允许您在PK中使用shadow properties(除了FK)。

您只需确保明确定义阴影属性,然后使用HasKey重载params string[] propertyNames

modelBuilder.Entity<ChecklistAndItem>()
    .Property<int>("ChecklistID");

modelBuilder.Entity<ChecklistAndItem>()
    .Property<int>("ChecklistItemID");

modelBuilder.Entity<ChecklistAndItem>()
    .HasKey("ChecklistID", "ChecklistItemID");