저는 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();
};
아니 더 나은 솔루션을?
(1) SQL에서 캐스케이드 삭제가 첫 번째 방법이며 바람을 피우고 있습니까 (캐스케이드 삭제를 지원하지 않는 것 같습니다). (2) 새로운 IsActive 열을 추가하면 무엇을 의미합니까? – Bronzato
1) 캐스케이드 삭제에 대한 SQL 제한을 데이터베이스에 직접 추가 한 다음 삭제를 위해 agregate를 표시해야합니다. - FK 오류가 없어야합니다. 2) 테이블에서 대부분의 데이터를 삭제하지 않고 해당 테이블의 IsActive db 열을 IsActive = 0, 우리의 응용 프로그램은 IsActive == 1 인 행에서만 작동합니다. – nihique
@nihique SQL 접근법에서 캐스케이드 삭제 문제는 외래 키가 (일반적으로) 필수 속성이므로 클라이언트가 부모가 될 때마다 오류가 발생합니다 삭제 된 것으로 표시되고 해당 속성을 null로 채 웁니다. 외래 키가 필요하지 않지만 모든 상황에 맞지 않는 경우 솔루션이 작동 할 수 있습니다. –