1

問題は、EF codefirst 規則のみを使用してカスケード削除を実行できないことです。特に、「依存エンティティの外部キーが null 許容でない場合、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

したがって、どこでもnull不可のFKがありますが、親AssociationSetting行を削除しようとすると、「DELETEステートメントがREFERENCE制約FK_ChamberPages_Chambersと競合しました。データベースで競合が発生しました...、テーブルdbo.AssociationPages、列AssociationIdメッセージ」。データベース内または EF fluent API を使用して制約を設定できることはわかっていますが、なぜこれが機能しないのですか?
アイデアをありがとう!

update
WillCascadeOnDelete() も機能しません:(

4

2 に答える 2

0

さて、調査目的で、最も単純な親子テーブルを作成し、テーブルごとに1行ずつ2行を配置し、カスケード削除で「アクションなし」としてFK関係を作成し、EF Code Firstエンティティを作成しました。
次に、列属性、Fluent API、明示的に WillDeleteOnCascade() メソッドを指定する、またはすべて一緒に、さまざまな方法で FK リレーションシップを設定しましたが、親行を削除しようとしてもうまくいきませんでした。削除する前に親レコードと子レコードの両方を取得したときにこれを達成した唯一の方法。この時点で、SQL プロファイラーは、親テーブルと子テーブルの両方で行が 1 つずつ削除されていることを示しました。
上記を要約すると、EF Code Firstでのカスケードは、EFによって作成されるデータベースに制約を設定することを意味すると思います。私は何かが欠けているかもしれません。

于 2013-11-13T21:15:58.973 に答える