当Child具有WillCascadeOnDelete的外键时,实体框架无法删除父条目(false)

时间:2016-08-04 07:28:40

标签: c# sql asp.net-mvc entity-framework

为什么我不能删除父项,而其子项在外键上设置了WillCascadeOnDelete(false)

这是父母:

public class EA_Client
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Client Id")]
    public int ClientId { get; set; }

    [Display(Name = "User Id")]
    public int? UserId { get; set; }

    [Display(Name = "Client Name")]
    public string ClientName { get; set; }

    public virtual AlvinCMSExtension.Models.UserProfile User { get; set; }

    public EA_Client()
    {
        UserId = 0;
        ClientName = "";
    }
}

这是孩子:

public class EA_Order
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Display(Name = "Order Id")]
    public int OrderId { get; set; }

    [Display(Name = "Client Id")]
    public int? ClientId { get; set; }

    [Display(Name = "Supplier Id")]
    public int? SupplierId { get; set; }

    [Display(Name = "Total Amount To Pay")]
    public decimal TotalAmountToPay { get; set; }

    [Display(Name = "Order Time")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime OrderTime { get; set; }

    [Display(Name = "Description")]
    public string Description { get; set; }

    public virtual ICollection<EA_OrderStatus> OrderStatuses { get; set; }
    public virtual ICollection<EA_OrderDetail> OrderDetails { get; set; }
    public virtual EA_Client Client { get; set; }
    public virtual EA_Supplier Supplier { get; set; }

    public EA_Order()
    {
        ClientId = null;
        SupplierId = null;
        TotalAmountToPay = 0;
        OrderTime = DateTime.Now;
        Description = "";
    }
}

这是孩子的模型构建器:

        mb.Entity<EA_Order>().HasOptional<EA_Client>(m => m.Client).WithMany().HasForeignKey(m => m.ClientId).WillCascadeOnDelete(false);
        mb.Entity<EA_Order>().HasOptional<EA_Supplier>(m => m.Supplier).WithMany().HasForeignKey(m => m.SupplierId).WillCascadeOnDelete(false);
        mb.Entity<EA_Order>().HasMany<EA_OrderStatus>(m => m.OrderStatuses);
        mb.Entity<EA_Order>().HasMany<EA_OrderDetail>(m => m.OrderDetails);

每次我尝试删除父级(EA_Client)时,都会发生以下错误:

  

{“DELETE语句与REFERENCE约束冲突\”FK_EAccounting.EA_Order_EAccounting.EA_Client_ClientId \“。冲突发生在数据库\”EAccountingDB \“,table \”EAccounting.EA_Order \“,列'ClientId'。\ r \ n \ n声明已经终止。“}

如何解决这个问题?我希望能够删除父级(EA_Client),因为父级是可选的,这意味着可以将子级(EA_Order)作为孤儿院条目。

1 个答案:

答案 0 :(得分:0)

我认为应该为父实体指定WillCascadeOnDelete,而不是为子实体指定.WillCascadeOnDelete(false)。此外,如果依赖项是可选的(如您所有),则默认行为应该是将子项保留在父项删除上。您是否尝试删除Client并删除Trait实体?

<强>更新

MSDN link批准我的陈述。