【发布时间】:2017-09-28 10:03:01
【问题描述】:
所以我在 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 中我得到了
" 实体类型 'Participants' 具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent 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);
还有
“实体类型'Participants'具有使用数据注释定义的复合主键。要设置复合主键,请使用流式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);
【问题讨论】:
-
如果您以类似于 modelBuilder.Entity
() .HasRequired(a => a.Activity) .WithMany() 的方式定义参与者和 ApplicationUser(参与者)之间的关系会发生什么。 WillCascadeOnDelete(false); ? -
已更新以显示我尝试过的其他内容。
-
你能分享
Activity类型吗?您确定您没有引入循环路径吗?如果是这种情况,那么您不需要从迁移中删除任何内容。
标签: c# entity-framework entity-framework-core entity-framework-migrations ef-fluent-api