2016-08-04 82 views
1

为什么我不能删除父项,而其子项在外键上设置为WillCascadeOnDelete(false)实体框架无法删除父项,当子项具有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语句与参考约束\”FK_EAccounting.EA_Order_EAccounting.EA_Client_ClientId \“发生冲突。冲突发生于数据库\ “EAccountingDB \”,表\ “EAccounting.EA_Order \”,列 '客户端Id'。\ r \ n该语句已终止。“}

如何解决这一问题?我想能够删除父母(EA_Client),因为父母是可选的,意味着可以让孩子(EA_Order)成为孤儿院入口。

+0

你在你的子表中有这个Id,你应该将它设置为null,然后删除命令 –

+0

这将非常麻烦,因为我需要将null设置为具有可选外键给EA_Client的其他实体。有没有办法让它自动化? –

回答

0

我认为WillCascadeOnDelete应该指定为父实体,而不是子类。此外,如果依赖关系是可选的(因为您有),默认行为应该让孩子在家长移除。您是否尝试删除.WillCascadeOnDelete(false)并删除Client实体?

更新:

MSDN link批准我的声明。

+0

我试过WillCascadeOnDelete(true),我能够删除客户端实体,但我的EA_Order也被删除。 –

+0

但你试过它在哪里?仍然在儿童实体?尝试为父 - 客户端实体添加'.WillCascadeOnDelete(false)',这将使您能够在不删除订单的情况下删除客户端。不要忘记为孩子删除这种方法。如果这适用于你 - 也尝试从两个地方删除它,它应该如你所期望的那样工作,因为你的依赖是可选的,所以实体框架应该用null更新ClientId,并安全地删除Client。 –

+0

我不能将它添加到EA_Client上,因为EA_Client没有EA_Order的信息,我很确定向EA_Client添加WillCascadeOnDelete(false)意味着如果删除子项,那么EA_Client不会被删除,这是相反的我想要的。 –