2014-01-12 2 views
0

EF6을 사용 중이고 remove를 호출하기 전에 작성된 컨텍스트 요청에서 하위 항목을 포함하지 않고 상위 항목을 삭제하려고합니다. 이 질문에 몇 번 질문을했고 다양한 버전의 응답을 구현하려했지만 컨텍스트 요청에 자식을 포함시키지 않고 부모를 삭제할 때 외래 키 제약 조건 문제가 계속 발생합니다.일대 다 관계의 부모 삭제 관련 문제

부모 :

public class Weapon 
{ 
    public Weapon() 
    { 
     Dices = new List<Dice>(); 
    } 

    public Guid Id {get;set;} 
    public List<Dice> Dices { get; set; } 
} 

아이 : 다음 주사위를 포함하지 않고 맥락에서 무기를 얻을 경우

public class Dice 
{ 
    public Guid Id { get; set; } 
    public int Sides { get; set; } 
    public Guid WeaponId { get; set; } 
    public Weapon Weapon { get; set; } 
} 

주사위 매핑

// Relationships 
this.HasRequired(_ => _.Weapon) 
.WithMany(_ => _.Dices) 
.HasForeignKey(_ => _.WeaponId) 
    .WillCascadeOnDelete(true); 

삭제로 인해 실패합니다 외래 키 제약 조건. 그러나 주사위를 포함 시키면 무기에 대한 삭제는 장애와 함께 작동합니다. IE

작품 :

public async Task<IHttpActionResult> DeleteWeapon(Guid id) 
{ 
    Weapon weapon = await _dbContext.Weapons.Include(w=>w.Dices).SingleOrDefaultAsync(w => w.Id == id); 
    _dbContext.Weapons.Remove(weapon); 
    await _dbContext.SaveChangesAsync(); 
    return Ok(); 
} 

실패 : 그 이었지만

public async Task<IHttpActionResult> DeleteWeapon(Guid id) 
{ 
    Weapon weapon = await _dbContext.Weapons.SingleOrDefaultAsync(w => w.Id == id); 
    _dbContext.Weapons.Remove(weapon); 
    await _dbContext.SaveChangesAsync(); 
    return Ok(); 
} 

내가 정말 그냥 부모를 삭제하는 객체의 자식을 모두 포함 할 필요가 없습니다 선호, 그리고 것 WillCascadeOnDelete 플래그는 무엇을위한 것입니다.

+0

EF 모델에서만 * 데이터베이스 *에 계단식 삭제가 없기 때문입니다. –

+0

어쨌든 코드를 통해 데이터베이스에 캐스케이드를 추가 하시겠습니까? (즉, SQL 스크립트는 실행되지 않습니다.) – Siegeon

+0

데이터베이스를 어떻게 만들었습니까? 코드 첫 번째는 계단식 삭제 외래 키 제약 조건을 생성해야합니다. –

답변

0

일반적으로 관계형 데이터베이스에는 관계의 부모 인 항목을 삭제할 수 없도록 제약 조건이 내장되어 있습니다. 이 데이터베이스는 쿼리를 중단시키는 줄을 막지 못하도록하는 데이터베이스입니다.

행을 삭제하려는 이유를 모르겠지만 일반적인 해결 방법은 Active에서 삭제하려는 테이블에 BOOLEAN 열을 추가하는 것입니다. 행 자체를 삭제하는 대신 항목을 FALSE으로 표시하고 데이터베이스를 참조하는 코드에서 필요한 검사를 수행하거나보다 강력한 쿼리를 사용하십시오.

반드시 행을 삭제해야하는 경우 적절한 관계를 해제해야합니다. 여전히 관계 데이터를 저장하려면 다른 테이블이나 저장할 테이블이 필요합니다. 어느 시점에서 위의 Active 행 솔루션보다 복잡합니다.

+1

이것은 실제로 대답이 아닙니다 (나는 어떻게 해야할지 모르겠다. A =>하지 마라). 그러나 둘 중 하나의 "일반적인"작업이 아닙니다. 레코드가 컬렉션 탐색 속성에있을 때 EF에서 특히 어려운 '활성'레코드를 항상 쿼리해야하기 때문에 프라이팬에서 화재로 이동할 수 있습니다. –

관련 문제