在Entity Framework 7中,当我尝试应用迁移时,我收到了错误
在表'ChangeOrder'上引入FOREIGN KEY约束'FK_ChangeOrder_User_CreatedByID'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束 无法创建约束。查看以前的错误。
我知道在旧版本的Entity Framework中你可以通过添加
来解决这个问题modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
到DbContext,但在EF7 modelBuilder
中似乎没有.Conventions
,谷歌只返回EF 4结果的旧版EF 4。
如何在Entity Framework 7中具体ON DELETE NO ACTION
约束?
编辑: Oleg提供的答案显然是按照外键进行的,但我想在全局范围内进行,因为使用一行代码来全局声明这一点会更容易,然后必须为数百个中的每一个指定代码。关系,我最终会有。
编辑2:Oleg的代码
public class ChangeOrder
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public Int16? ApprovedByID { get; set; }
public Byte ApprovalStatusID { get; set; }
public Int16 AssignedToID { get; set; }
public Int16 CreatedByID { get; set; }
public Byte CurrentStatusID { get; set; }
public DateTime? DateApproved { get; set; }
public DateTime? EndDate { get; set; }
public Byte ImpactID { get; set; }
public Byte PriorityID { get; set; }
public DateTime? StartDate { get; set; }
public Byte TypeID { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string ReasonForChange { get; set; }
[ForeignKey("ApprovedByID")]
public User ApprovedBy { get; set; }
[ForeignKey("ApprovalStatusID")]
public ChangeApprovalStatus ApprovalStatus { get; set; }
[ForeignKey("AssignedToID")]
public User AssignedTo { get; set; }
[ForeignKey("CreatedByID")]
public User CreatedBy { get; set; }
[ForeignKey("ImpactID")]
public ChangeImpact Impact { get; set; }
[ForeignKey("PriorityID")]
public ChangePriority Priority { get; set; }
[ForeignKey("TypeID")]
public ChangeType ChangeType { get; set; }
[ForeignKey("CurrentStatusID")]
public ChangeStatus CurrentStatus { get; set; }
}
public class JobSightDBContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelbuilder)
{
base.OnModelCreating(modelbuilder);
}
DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
DbSet<ChangeImpact> ChangeImapct { get; set; }
DbSet<ChangeOrder> ChangeOrders { get; set; }
DbSet<ChangePriority> ChangePriorities { get; set; }
DbSet<ChangeStatus> ChangeStatus { get; set; }
DbSet<ChangeType> ChangeTypes { get; set; }
DbSet<User> Users { get; set; }
}
答案 0 :(得分:52)
在GitHub上挖掘,并与MS的一个非常有耐心的人一起工作,目前的解决方案是将其添加到DbContext
protected override void OnModelCreating(ModelBuilder modelbuilder)
{
foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
base.OnModelCreating(modelbuilder);
}
答案 1 :(得分:15)
施工
modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
{
b.HasOne("myNamespace.Models.User")
.WithMany()
.HasForeignKey("CreatedByID")
.OnDelete(DeleteBehavior.Cascade);
});
表示使用FK_ChangeOrder_User_CreatedByID
创建REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE
。它应该存在于迁移期间创建的protected override void BuildModel(ModelBuilder modelBuilder)
YourContextModelSnapshot.cs
中。我不确定我是否完全理解你的问题,但我认为你应该将这样的构造添加到XXXModelSnapshot.cs
或删除不需要的构造,这已经存在于此处。
更新:我发现您在模型中遇到了问题。
中有以下属性public Int16? ApprovedByID { get; set; }
public Int16 AssignedToID { get; set; }
public Int16 CreatedByID { get; set; }
// navigation properties
[ForeignKey("ApprovedByID")]
public User ApprovedBy { get; set; }
[ForeignKey("AssignedToID")]
public User AssignedTo { get; set; }
[ForeignKey("CreatedByID")]
public User CreatedBy { get; set; }
默认情况下,迁移尝试在所有属性上设置DeleteBehavior.Cascade
。
您可以通过更改OnModelCreating
来覆盖行为,DeleteBehavior.Restrict
为所有密钥设置DeleteBehavior.Cascade
行为,或者只设置一个密钥DeleteBehavior.SetNull
或DeleteBehavior.Cascade
行为。例如,下面的代码使用CreatedByID
上的ON DELETE CASCADE
(在外键上创建DeleteBehavior.Restrict
)和其他外键上的ON DELETE
使用public class JobSightDBContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelbuilder)
{
base.OnModelCreating(modelbuilder);
modelbuilder.Entity(typeof (ChangeOrder))
.HasOne(typeof (User), "ApprovedBy")
.WithMany()
.HasForeignKey("ApprovedByID")
.OnDelete(DeleteBehavior.Restrict); // no ON DELETE
modelbuilder.Entity(typeof (ChangeOrder))
.HasOne(typeof (User), "AssignedTo")
.WithMany()
.HasForeignKey("AssignedToID")
.OnDelete(DeleteBehavior.Restrict); // no ON DELETE
modelbuilder.Entity(typeof (ChangeOrder))
.HasOne(typeof (User), "CreatedBy")
.WithMany()
.HasForeignKey("CreatedByID")
.OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE
}
DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
DbSet<ChangeImpact> ChangeImapct { get; set; }
DbSet<ChangeOrder> ChangeOrders { get; set; }
DbSet<ChangePriority> ChangePriorities { get; set; }
DbSet<ChangeStatus> ChangeStatus { get; set; }
DbSet<ChangeType> ChangeTypes { get; set; }
DbSet<User> Users { get; set; }
}
外键):
=SUM(IF(ISERROR($A$1:$A$3);0;$A$1:$A$3)))