1

オプションの 1 対 1 および 1 対多の関係でカスケードを機能させるのに問題があります。それらの 1 つを有効にすると正常に動作しますが、両方を有効にすると、「循環カスケード例外の可能性」が発生します。

複数の「DeliverAddresses」と 1 つの「VisitAddress」を持つ「Customer」があります。したがって、住所については、オプションの DeliverAddressForCustomer とオプションの VisitAddressForCustomer があります。

これにより、次の表が得られます。

CREATE TABLE [dbo].[Customer]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY
    [Name] NVARCHAR(50) NOT NULL,
)

CREATE TABLE [dbo].[Address]
(
    [Id] INT NOT NULL PRIMARY KEY IDENTITY, 
    [Street] NVARCHAR(50) NOT NULL,
    [DeliverAddressForCustomerId] INT NULL, 
    [VisitAddressForCustomer] INT NULL, 
    CONSTRAINT [FK_Address_Customer_DeliverAddressForCustomerId] FOREIGN KEY ([DeliverAddressForCustomerId]) REFERENCES [Customer]([Id]), 
    CONSTRAINT [FK_Address_Customer_VisitAddressForCustomerId] FOREIGN KEY ([VisitAddressForCustomerId]) REFERENCES [Customer]([Id])
)

これは、次のマッピングで機能します。

        this.ToTable("Address");
        this.Property(t => t.Id).HasColumnName("Id");
        this.Property(t => t.Postcode).HasColumnName("Postcode");
        this.Property(t => t.DeliverAddressForCustomerId).HasColumnName("DeliverAddressForCustomerId");

        // Relationships
        this.HasOptional(t => t.DeliverAddressForCustomer)
            .WithMany(t => t.DeliverAddresses)
            .HasForeignKey(d => d.DeliverAddressForCustomerId)
            .WillCascadeOnDelete(true);

        this.HasOptional(a => a.VisitAddressForCustomer)
            .WithOptionalDependent(k => k.VisitAddress)
            .Map(x => x.MapKey("VisitAddressForCustomerId"))
            .WillCascadeOnDelete(true);

両方の「WillCascadeOnDelete」を true に設定すると、既存の DB で機能しますが、DB を作成する場合は機能しません...次の例外メッセージが表示されます。

テーブル 'Address' に FOREIGN KEY 制約 'FK_dbo.Address_dbo.Address_Customer_VisitAddressForCustomerId' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。

しかし、deliveryAddress または visitAddress を削除すると、顧客はこの設定に影響されないはずなので、これは私には意味がありません。したがって、循環カスケードがあってはなりません。

4

1 に答える 1

2

メッセージには、「サイクルまたは複数のカスケード パスが発生する可能性があります」と表示されます。重要なのは最後の部分です。SQL サーバーでは、1 つのテーブルでカスケードされた削除を含む複数の FK 制約を使用できません。

ちなみに、カスケード削除では、 を削除した場合に何が起こるかは規定されていませんAddressが、Customer.

これも参照してください: SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?

于 2013-01-15T12:51:14.373 に答える