簡體   English   中英

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

[英]Composite Key EF Core getting error when using Fluent Api

所以我在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:在嘗試了Roy的建議之后,這就是我所得到的

在表'參與者'上引入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 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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