如果我有:
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
答案 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");