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

问题描述 投票:3回答:1

如果我有:

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

c# entity-framework-core
1个回答
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");
© www.soinside.com 2019 - 2024. All rights reserved.