1

선택적 일대일 및 일대 다 관계에서 작동하도록 몇 가지 문제가 계단식으로 나타납니다. 그 중 하나를 사용하면 제대로 작동하지만 두 가지 결과를 모두 '가능한 순환 계단식 예외'로 설정할 수 있습니다.EF CodeFirst 매핑 두 개의 계단식 삭제 관계

나는 여러 개의 'DeliverAddresses'와 하나의 'VisitAddress'가있는 '고객'이 있습니다. 따라서 주소에는 선택적인 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]) 
) 

: 지금은 참으로 모두 'WillCascadeOnDelete'설정이있는 경우

 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); 

를, 그것은 기존 작동합니다 DB하지만 DB를 만들고 싶지 않은 경우 ... 다음 예외 메시지가 표시됩니다.

FOREIGN KEY 제약 조건 소개 'Address'테이블의 'FK_dbo.Address_dbo.Address_Customer_VisitAddressForCustomerId'가 사이클 또는 여러 개의 계단식 경로를 유발할 수 있습니다. NO DELETE NO ACTION 또는 ON UPDATE NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오.

그러나 이는 deliveryAddress 또는 visitAddress를 삭제하면 고객이이 설정에서 변경되지 않아야하므로 나에게 이해가되지 않습니다. 따라서 순환 계단식이 없어야합니다.

답변

2

메시지에 "사이클 또는 복수 캐스케이드 경로이 발생할 수 있음"메시지가 표시됩니다. 중요한 마지막 부분입니다. SQL Server는 하나의 테이블에서 계단식 삭제와 함께 둘 이상의 FK 제약 조건을 허용하지 않습니다.

덧붙여 말하자면, 계단식 삭제는 Address을 삭제했지만 Customer을 삭제하면 어떻게 될지를 지정하지 않습니다.

또한이를 참조하십시오 SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?

+0

. "계단식 한 테이블에서 삭제 둘 이상의 FK 제약 조건을 허용하지 않습니다 SQL 서버" SQL Server 대신 EF를 의미합니까? SQL Server가 아닌 EF가 캐스 캐이 딩을 처리한다고 생각 했으므로 – Rob

+0

예, 그렇기 때문에 데이터베이스를 만들려고 할 때이 메시지가 표시됩니다. 나는 당신이'InvalidOperationException'을 가졌다 고 생각합니다. "데이터베이스 생성은 성공했지만, 데이터베이스 객체의 생성은 인용 부호가있는'SqlException'을 가지고 있지 않습니다. –

+0

우리는 문제를 해결했지만 고객을 제거하기 전에 트리거가 없거나 주소를 명시 적으로 제거 할 수 없다는 점에 유의 해 주셔서 감사합니다. – Rob

관련 문제