簡體   English   中英

使用ID和外鍵的EF core 2復合主鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM