所以我在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);
答案 0 :(得分:5)
您要做的是在活动和参与者之间建立一种关系,这在EFCore中有点不同。
要做到这一点,您需要在模型构建器中引用ForeignKey属性而不是NavigationProperties,如下所示:
modelBuilder.Entity<Participants>()
.HasKey(p => new { p.ActivityId , p.ParticipantId });