在'OrderDetails'表上引入FOREIGN KEY约束'FK_dbo.OrderDetails_dbo.Order_OrderId'可能会导致

时间:2014-02-18 23:11:55

标签: c# ef-code-first entity-framework-6 cascading-deletes

我从PMC收到此错误消息:

  

在表'OrderDetails'上引入FOREIGN KEY约束'FK_dbo.OrderDetails_dbo.Order_OrderId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束。查看以前的错误。

我在SO上找到了一个帖子,其中有一个已接受的答案,但它对我不起作用。

这些是我的表格:

[Table("Order")]
public class Order
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int Id { get; set; }

    [Required]
    public string UserId { get; set; }      

    public virtual List<OrderDetails> OrderDetails { get; set; }

    [ForeignKey("UserId")]
    public virtual ApplicationUser User { get; set; }
}


[Table("OrderDetails")]
public class OrderDetails
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity), Key]
    public int Id { get; set; }

    [Required]
    public int OrderId { get; set; }


    [ForeignKey("OrderId")]
    public virtual Order Order { get; set; }
}

FluentApi

modelBuilder.Entity<OrderDetails>()
    .HasRequired(u => u.Order)
    .WithMany()
    .WillCascadeOnDelete(false);

如果OrderDetails被删除,我不希望删除Order。但另一种方式对我来说很好。

那么我尝试过的是什么问题?

2 个答案:

答案 0 :(得分:2)

我发现了问题!

我一直在运行执行最后生成的迁移文件的命令Update-Database

我删除了我创建的上一个迁移文件,并再次运行了Add-Migration命令,该命令生成了一个新文件,其中包含我最近的modelBuilder.Entity<OrderDetails>()...FluentApi}代码更改。

然后运行命令Update-Database并且它有效!

所以我不知道的是每次你在

中改变一些东西

protected override void OnModelCreating(DbModelBuilder modelBuilder) { ... }

您需要再次执行Add-Migration filename

答案 1 :(得分:1)

在这里使用不带参数的.WithMany()是错误的。因为Order.OrderDetails表示关系的反向导航属性,所以必须使用...

.WithMany(o => o.OrderDetails)