[英]EF core 2 composite primary key using Id and a foreign key
我有兩個模型課
public class ClassA
{
public Guid Id { get; set; }
public IEnumerable<ClassB> ClassBs { get; set; }
}
public class ClassB
{
public String Id { get; set; }
}
如何告訴實體框架使用帶有ClassA.Id和ClassB.Id的復合主鍵創建表ClassB? 這樣,我可以在ClassB表中具有相同ID的多個記錄。 我不想更改ClassB來添加另一個Guid Id屬性。 我也不想使用EF屬性,我想將模型類與ORM框架分開。
編寫您的ClassB
,如下所示:
public class ClassB
{
public String Id { get; set; }
public Guid ClassAId {get; set;}
...............
public ClassA ClassA {get; set;}
}
然后編寫ClassB
配置,如下所示:
public class ClassBConfiguration : IEntityTypeConfiguration<ClassB>
{
public void Configure(EntityTypeBuilder<ClassB> builder)
{
builder.HasKey(b => new { b.Id, b.ClassAId });
builder.HasOne(b => b.ClassA).WithMany(a => a.ClassBs).HasForeignKey(b => b.ClassAId);
}
}
然后在OnModelCreating
中如下所示:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfiguration(new ClassBConfiguration());
}
如果您不想在ClassB
模型中引入顯式的FK屬性,則可以利用HasKey
接收string
屬性名稱的非lambda重載並傳遞影子 FK屬性名稱,該名稱在該模型中的慣例為“ ClassAId”:
modelBuilder.Entity<ClassB>()
.HasKey("Id", "ClassAId");
該方法的缺點之一是使用“魔術”弦。 但是可以借助nameof
運算符來避免。
另一個缺點是,檢索/操作ClassB
對象的唯一方法是通過父ClassA
對象(盡管在EF Core LINQ to Entities查詢中,您可以使用EF.Property<Guid>(param, "ClassAId")
訪問它以進行過濾/訂購/投影(如果需要)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.