为什么我不能删除父项,而其子项在外键上设置了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)作为孤儿院条目。
答案 0 :(得分:0)
我认为应该为父实体指定WillCascadeOnDelete
,而不是为子实体指定.WillCascadeOnDelete(false)
。此外,如果依赖项是可选的(如您所有),则默认行为应该是将子项保留在父项删除上。您是否尝试删除Client
并删除Trait
实体?
<强>更新强>
MSDN link批准我的陈述。