1

问题是我无法仅使用 EF codefirst 约定执行级联删除。他们特别说:“如果依赖实体上的外键不可为空,则 Code First 会在关系上设置级联删除”

我有父实体和子实体:

[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 fluent API 设置约束,但为什么不起作用?
谢谢你的想法!

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

4

2 回答 2

0

好的,出于调查目的,我创建了一个最简单的父子表,放置两行 - 每个表一个,在级联删除时将 FK 关系创建为“无操作”并编写 EF Code First 实体。
然后我以各种方式设置 FK 关系 - 通过列属性、Fluent API、显式指定 WillDeleteOnCascade() 方法或所有方法,但尝试删除父行没有运气。在删除之前检索父记录和子记录时,我实现此目的的唯一方法。此时,SQL 分析器显示父表和子表的行都被一一删除。
综上所述,我认为 EF Code First中的级联意味着对 EF 创建的数据库的设置约束。我可能会错过一些东西。

于 2013-11-13T21:15:58.973 回答
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; }

}
于 2013-11-13T19:12:25.430 回答