使用Fluent Api時,複合鍵EF Core收到錯誤

c# ef-fluent-api ef-migrations entity-framework entity-framework-core

所以我在Entity Framework Core中有以下類。我正在嘗試進行代碼優先遷移,並且不能在我的生活中弄清楚如何為這項工作製作流暢的API。

public class Participants
{
    public Activity Activity { get; set; } //Class with Id and Name of Activity
    public ApplicationUser Participant { get; set; } 

    [Key]
    [Column(Order = 1)]
    public int ActivityId { get; set; }


    [Key]
    [Column(Order = 2)]
    public string ParticipantId { get; set; }
}

在EF6中,我能夠在OnModelCreating中執行此操作以使其正常工作。

 modelBuilder.Entity<Attendance>()
            .HasRequired(a => a.Activity)
            .WithMany()
            .WillCascadeOnDelete(false);

但是在EF Core我得到了

“實體類型'參與者'具有使用數據註釋定義的複合主鍵。要設置複合主鍵,請使用流暢的API。”

我試過用

modelBuilder.Entity<Participants>().HasKey(p => new {p.Activity, p.Participant});

但是,這只會導致

在表'參與者'上引入FOREIGN KEY約束'FK_Participants_AspNetUsers_ParticipantId'可能會導致循環或多個級​​聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

如果有更好的方法來完成整個事情,我願意接受建議。如果您有多個訂閱,我基本上試圖讓Mosh Hamedani“成為一個完整的堆棧開發人員”在EF核心工作。該示例位於“13-full-stack-fundamentals”文件夾中。

更新:也嘗試過

        modelBuilder.Entity<Participants>()
            .HasOne(p => p.Activity)
            .WithMany()
            .OnDelete(DeleteBehavior.Cascade);

還有

“實體類型'參與者'具有使用數據註釋定義的複合主鍵。要設置複合主鍵,請使用流暢的API。”

更新2:在嘗試了羅伊的建議後,這就是我所得到的

在表'參與者'上引入FOREIGN KEY約束'FK_Participants_AspNetUsers_ParticipantId'可能會導致循環或多個級​​聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

更新3:在遷移中

我刪除了一個OneDelete:ReferntialAction.Cascade並且它有效。我從FK_Participants_AspNetUsers_ParticipantId中刪除了一個。

我也在OnModelCreating中更改了這個

        modelBuilder.Entity<Participants>()
            .HasKey(p => new { p.ActivityId, p.ParticipantId });
        base.OnModelCreating(modelBuilder);

        //Added this ( Not sure if it's needed if anyone knows let me know) 
        modelBuilder.Entity<Participants>()
            .HasOne(p => p.Activity)
            .WithMany()
            .OnDelete(DeleteBehavior.Cascade);

一般承認的答案

你要做的是創建一個活動和參與者之間的關係,這在EFCore中有點不同。

要做到這一點,您需要在模型構建器中引用ForeignKey屬性而不是NavigationProperties,如下所示:

    modelBuilder.Entity<Participants>()
        .HasKey(p => new { p.ActivityId , p.ParticipantId });


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow