使用Fluent Api时,复合键EF Core收到错误

vgw*_*rdx 6 c# entity-framework ef-migrations entity-framework-core ef-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; }
}
Run Code Online (Sandbox Code Playgroud)

在EF6中,我能够在OnModelCreating中执行此操作以使其正常工作.

 modelBuilder.Entity<Attendance>()
            .HasRequired(a => a.Activity)
            .WithMany()
            .WillCascadeOnDelete(false);
Run Code Online (Sandbox Code Playgroud)

但在EF Core我得到了

"实体类型'参与者'具有使用数据注释定义的复合主键.要设置复合主键,请使用流畅的API."

我试过用

modelBuilder.Entity<Participants>().HasKey(p => new {p.Activity, p.Participant});
Run Code Online (Sandbox Code Playgroud)

但是,这只会导致

在表'参与者'上引入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);
Run Code Online (Sandbox Code Playgroud)

还有

"实体类型'参与者'具有使用数据注释定义的复合主键.要设置复合主键,请使用流畅的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);
Run Code Online (Sandbox Code Playgroud)

小智 6

您要尝试做的是在“活动”和“参与者”之间创建一种关系,该关系在EFCore中有些不同。

为此,您需要在Modelbuilder中引用ForeignKey属性而不是NavigationProperties,如下所示:

    modelBuilder.Entity<Participants>()
        .HasKey(p => new { p.ActivityId , p.ParticipantId });
Run Code Online (Sandbox Code Playgroud)