オプションの 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 を削除すると、顧客はこの設定に影響されないはずなので、これは私には意味がありません。したがって、循環カスケードがあってはなりません。