2013-04-25 2 views
2

저는 Entity Framework Code First + Durandal + Breeze가있는 프로젝트에서 작업합니다. 내 프로젝트를 실행할 때 내 엔티티 프레임 워크 코드 첫 번째 데이터베이스가하위 엔터티가 포함 된 엔터티를 삭제할 때 breeze 오류가 발생했습니다.

public class Packing 
{ 
    [Key] 
    public int Id { get; set; } 
    public string PackingDescription { get; set; } 
    ... 
    public virtual List<Isotope> Isotopes { get; set; } 
    public virtual List<PhysicalForm> PhysicalForms { get; set; } 
    public virtual List<ChemicalForm> ChemicalForms { get; set; } 
} 

public class Isotope 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    ... 
    public int PackingId { get; set; } 
    public virtual Packing Packing { get; set; } 
} 

public class ChemicalForm 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    ... 
    public int PackingId { get; set; } 
    public virtual Packing Packing { get; set; } 
} 

public class PhysicalForm 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    ... 
    public int PackingId { get; set; } 
    public virtual Packing Packing { get; set; } 
} 

을 만들어 :

나는 이들 엔티티 모델을 가지고있다.

먼저 데이터베이스에서 '손으로'연속 삭제를 테스트합니다. 여러 개의 동위 원소로 하나의 포장이 있고 패킹을 삭제하면 모든 계단식 동위 원소가 삭제됩니다. 이것은 나에게 좋다. 나도 같은 시나리오를하려고 할 때 바람을 사용하여

내 프로젝트에서 런타임에 지금

는 :

var deletePackings = function (packingsObservable) { 

    // Input: packingsObservable: an observable filled with a list of packings to delete 
    // Output: none 

    for (var i = 0; i < packingsObservable().length; i++) { 
     packingsObservable()[i].entityAspect.setDeleted(); 
    }; 
    return manager.saveChanges(); 
}; 

나는 아래의 오류가 발생했습니다 :

업데이트 이런 Packing 요소를 삭제 FOREIGN KEY 제약 조건 \ "FK_dbo.Isotopes_dbo.Packings_PackingId \"과 (과) 충돌했습니다. 충돌은, 테이블 \ 데이터베이스 \ "TRANSPORTBOEKDB \"발생 "dbo.Packings \"열 '이드'. 연구 \의 n이 문이 종료되었습니다. \ "}

는 지금은 다른 SO post

이 읽을 아직 클라이언트 측을 지원하지 않습니다

Breeze는 삭제, 당신은 그것들을 '분리'를 이미로드 된 모든 클라이언트 측의 주문을 반복해야 할 것이다.

을 (우리는이 일을 고려하고있다) '캐스케이드' 내 신청서에 오류가있는 이유는 무엇입니까?

이미로드 된 하위 엔터티를 반복 실행하고 '분리'해야합니까? 수동으로 바람과 코드에 의해 모든 자식 개체를 분리함으로써


UPDATE

트릭을 할하지만이 고통스러운 :

var deletePackings = function (packingsObservable) { 

    // Input: packingsObservable: an observable filled with a list of packings to delete 
    // Output: none 
    // Remark: we loop from end to begin of the observable! 

    var entity; 

    // Since Breeze does not yet support client side 'cascaded' deletes (we are considering this one), 
    // you will need to iterate over any child entity that are already loaded and 'detach' them. 

    for (var i = packingsObservable().length - 1; i >= 0; i--) { 

     // Detach any child entities of type isotope 
     for (var j = packingsObservable()[i].isotopes().length - 1; j >= 0; j--) { 
      entity = packingsObservable()[i].isotopes()[j]; 
      manager.detachEntity(entity); 
     } 

     // Detach any child entities of type chemicalForm 
     for (var j = packingsObservable()[i].chemicalForms().length - 1; j >= 0; j--) { 
      entity = packingsObservable()[i].chemicalForms()[j]; 
      manager.detachEntity(entity); 
     } 

     // Detach any child entities of type physicalForm 
     for (var j = packingsObservable()[i].physicalForms().length - 1; j >= 0; j--) { 
      entity = packingsObservable()[i].physicalForms()[j]; 
      manager.detachEntity(entity); 
     } 

     packingsObservable()[i].entityAspect.setDeleted(); 
    }; 


    return manager.saveChanges(); 
}; 

아니 더 나은 솔루션을?

답변

2

필요에 따라 SQL에서 계단식 삭제를 수행하고 클라이언트를 잊어 버리면 데이터를 새로 고침하십시오.

아니면 agreggate 실체에 대한 새로운이 isActive 열을 추가 할 수 있습니다, 이것은 삭제 캐스케이드에 대한 :)

+0

(1) SQL에서 캐스케이드 삭제가 첫 번째 방법이며 바람을 피우고 있습니까 (캐스케이드 삭제를 지원하지 않는 것 같습니다). (2) 새로운 IsActive 열을 추가하면 무엇을 의미합니까? – Bronzato

+0

1) 캐스케이드 삭제에 대한 SQL 제한을 데이터베이스에 직접 추가 한 다음 삭제를 위해 agregate를 표시해야합니다. - FK 오류가 없어야합니다. 2) 테이블에서 대부분의 데이터를 삭제하지 않고 해당 테이블의 IsActive db 열을 IsActive = 0, 우리의 응용 프로그램은 IsActive == 1 인 행에서만 작동합니다. – nihique

+0

@nihique SQL 접근법에서 캐스케이드 삭제 문제는 외래 키가 (일반적으로) 필수 속성이므로 클라이언트가 부모가 될 때마다 오류가 발생합니다 삭제 된 것으로 표시되고 해당 속성을 null로 채 웁니다. 외래 키가 필요하지 않지만 모든 상황에 맞지 않는 경우 솔루션이 작동 할 수 있습니다. –

1

지원은 매우 합리적인 요청입니다 삭제 내가 DB의 무서워, 내 선호하는 방법입니다.

클라이언트 측 캐스케이드 삭제 지원에 대한 투표를 여기에 추가하십시오 : Breeze User Voice. Breeze 제품에 추가 할 기능을 결정할 때이 장소를 매우 중요하게 생각합니다.

+0

breeze 사용자 음성 투표가 완료되었습니다. – Bronzato

1

breeze 제작자가 고려중인 기능은 클라이언트 측 캐스케이드 삭제이지만 breeze도 서버 측 캐스케이드 삭제를 지원하지 않습니다.서버 측 캐스케이드 삭제를 사용하려면 특정 작업을 수행해야합니다.

setDeleted는 fkey가 null이 아닌 경우에도 캐시의 모든 fkey 값을 참조합니다. 참조하는 레코드에 null이 아닌 fkey 제약 조건이있는 경우 UPDATE가 실패하므로 하위 레코드를 저장하지 않아야합니다. 저장이 목표를 달성하기 전에 캐시에서 자식을 제거하는 접근 방법이며 매개 변수없이 saveChanges()를 호출 할 수 있습니다. 또는 삭제 한 레코드가 포함 된 배열을 전달할 수 있습니다. 그런 다음 구원받은 후에 자녀를 퇴거시키고 싶을 것입니다. 또는 해당 엔티티 관리자 사용을 중지 할 수 있습니다.

관련 문제