2014-12-04 4 views
0

엔티티 프레임 워크 6에서 관계를 설정하고 계단식 삭제 작업을하는 데 문제가 있습니다.엔티티 프레임 워크에서 계단식 삭제

나는 그룹은 필드가, 모듈이 그룹이 이제 다음 개체

public class Module { 
    public long Id { get; set; }; 
    public virtual ICollection<Group> Groups { get; set; }; 
} 

public class Group { 
    public long Id { get; set; }; 
    public virtual ICollection<Field> Fields { get; set; }; 
} 

public class Field { 
    public long Id { get; set; }; 
    public virtual FieldLink Link { get; set; }; 
} 

public class FieldLink { 
    public long Id { get; set; }; 
    public virtual Module LinkToModule { get; set; }; 
} 

가, 필드는 링크가있을 수 있습니다. 링크는 LinkToModule을 가지지 만 이것은 부모 모듈/그룹이 속한 모듈과 다른 모듈이 될 수 있습니다.

내가 그렇게

public ModuleConfig() 
{ 
    this.ToTable("Module"); 
} 

public FieldGroupConfig() 
{ 
    this.ToTable("FieldGroup"); 

    // relationships 
    this.HasRequired(e => e.Module) 
     .WithMany(e => e.Groups) 
     .HasForeignKey(e => e.ModuleId); 
} 

public FieldConfig() 
{ 
    this.ToTable("Field"); 

    this.HasRequired(e => e.FieldGroup) 
     .WithMany(e => e.Fields) 
     .HasForeignKey(e => e.FieldGroupId); 


    this.HasOptional(e => e.Link) 
     .WithRequired(e => e.Field); 

} 

public FieldLinkConfig() 
{ 
    this.ToTable("FieldLink"); 

    this.HasRequired(e => e.LinkToModule) 
     .WithMany() 
     .HasForeignKey(e => e.LinkToModuleId); 
} 

처럼 내 관계가 지금은 내 테스트를 실행하고 설정을 가지고, 나는 다음과 같은 오류 내가 관계를 확인하는 경우에 대한

Test method ModuleServiceTests.ModuleService_DeleteAsync_ByEntity threw exception: 

System.Data.SqlClient.SqlException: The DELETE statement conflicted with the REFERENCE constraint "FK_dbo.FieldLink_dbo.Field_Id". The conflict occurred in database "TestDb", table "dbo.FieldLink", column 'Id'. 

을 얻을, 그것은 테이블 필드 사이 .Id> FieldLink.Id 및 DELETE 규칙은 NO ACTION으로 설정됩니다. 좋아, 그래서 내가

그래서 내가

this.HasOptional(e => e.Link) 
    .WithRequired(e => e.Field) 
    .WillCascadeOnDelete(true); 

this.HasOptional(e => e.Link) 
    .WithRequired(e => e.Field); 

에서 FieldConfig의 코드를 업데이트하지만 지금 내가하려고 할 때 (사실) WillCascadeOnDelete를 그 관계를 업데이트하고 사용해야 할 것 같아요 내 테스트를 실행해도 데이터베이스가 생성되지 않고 오류가 발생합니다.

Initialization method Test.TestInitialize threw exception. 
System.Data.SqlClient.SqlException: Introducing FOREIGN KEY constraint 'FK_dbo.FieldLink_dbo.Field_Id' on table 'FieldLink' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

ase 도움? 관계를 잘못 설정 했습니까? 이것에 대해 잘못된 길을 가고 있습니까?

답변

0

MS SQL Server는 계단식 삭제 작업의주기를 지원하지 않습니다. 삭제를 계단식으로 배열하거나이 answer과 같은 대안을 찾으려면 두 방향 중 하나만 선택해야합니다 (트리거의 예는 Listing 6here입니다). 이 answer에도 통찰력이 있습니다.

+0

그래서 누군가가 모듈을 삭제하면, 나는 그 모듈을 가리키는 모든 FieldLinks를 수동으로 코드화하고, 먼저 삭제 한 다음, 모듈을 삭제하고 sql이 나머지를 캐스케이드하도록해야 할 것입니까? – Gillardo

+0

코드를 삭제하거나 수동으로 해결할 방향을 하나만 선택할 수 있습니다 (코드에서 'INSTEAD OF'트리거 사용). 나는 그 대답에 대한 몇 가지 링크를 추가했다. – alik

관련 문제