EF不是级联删除

时间:2013-11-13 18:05:20

标签: asp.net .net asp.net-mvc entity-framework ef-code-first

问题是我不能仅使用EF codefirst约定执行级联删除。他们特别说:"If a foreign key on the dependent entity is not nullable, then Code First sets cascade delete on the relationship"

我有父母和子女实体:

[Table("AssociationPages")]
public class AssociationPage
{
    [Column("AssociationPageID"), Required, Key]
    public int Id { get; set; }

    [Required, ForeignKey("AssociationSetting")]
    public int AssociationId { get; set; }
    public virtual AssociationSetting AssociationSetting { get; set; }
}

[Table("AssociationSetting")]
public class AssociationSetting
{
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int AssociationId { get; set; }

    public virtual ICollection<AssociationPage> Pages { get; set; }

}

MS SQL Server中的我的AssociationPages表如下所示:

CREATE TABLE [dbo].[AssociationPages](
    [AssociationPageID] [int] IDENTITY(1,1) NOT NULL,
    [AssociationId] [int] NOT NULL,
...
)

和一个FK(但不应该,因为EF有自己的约定):

ALTER TABLE [dbo].[AssociationPages]  WITH CHECK ADD  CONSTRAINT [FK_ChamberPages_Chambers] FOREIGN KEY([AssociationId])
REFERENCES [dbo].[AssociationSetting] ([AssociationId])
GO

所以我到处都有不可为空的FK,但是一旦我尝试删除父AssociationSetting行,然后得到“DELETE语句与REFERENCE约束FK_ChamberPages_Chambers冲突。冲突发生在数据库...,表dbo.AssociationPages,列AssociationId信息”。我知道我可以在数据库中设置约束或使用EF流畅的API但为什么这个不起作用? 谢谢你的想法!

更新
WillCascadeOnDelete()也不起作用:(

2 个答案:

答案 0 :(得分:0)

可能是Code First没有设置级联,因为您没有遵循命名约定。

试试这个:

public class AssociationPage
{
  public int Id { get; set; }

  public int AssociationSettingId { get; set; }

  public virtual AssociationSetting AssociationSetting { get; set; }
}

public class AssociationSetting
{

  public int Id { get; set; }

  public virtual ICollection<AssociationPage> Pages { get; set; }

}

答案 1 :(得分:0)

好的,在调查目的中,我创建了一个最简单的父子表,放置两行 - 每个表一个,在级联删除时创建FK关系为“无操作”并写入EF Code First实体。
然后我设置FK关系variuos方式 - 通过列属性,Fluent API,显式指定WillDeleteOnCascade()方法或alltogether但没有运气试图删除父行。在删除之前检索父记录和子记录时,我实现此目的的唯一方法。此时,SQL事件探查器显示,父表和子表都逐行删除行 总结以上内容,我认为EF Code First 中的级联意味着EF创建的数据库的设置约束。我可能会错过一些东西。