2014-04-24 2 views
2

breeze api에 따르면 setDeleted가 호출되면 관련된 모든 엔티티에서 엔티티가 제거됩니다. 이것은 사실이지만 엔티티 관리자의 importEntities 함수를 사용하여 삭제 된 항목을 가져올 때 문제가 발생합니다. 삭제 된 엔티티는 네비게이션 속성을 비울 것이지만 삭제 된 항목을 포함하는 탐색 속성을 가진 다른 엔티티는 해당 항목을 자신의 네비게이션 목록에 보관합니다. 엔티티에서 setDeleted가 호출되면 이미 삭제 되었더라도 문제가 해결되지만 필요하지는 않습니다.Breeze - 지운 편지함 탐색 속성 버그

DocCode 테스트를 위해이 테스트 케이스를 만들었습니다.

/********************************************************* 
    * Create an EM with parent/child relationship data. Export the EM and import it into a new one, delete the child item in the exported EM 
    * export the 2nd EM into the first EM. 
    *********************************************************/ 
    test("test imported deleted nav properties", 2, function() { 
     var em = newEm(); 

     // create a new parent Customer 
     var parentCustomer = em.createEntity("Customer", { 
      CustomerID: dummyCustID, 
      CompanyName: 'TestCo' 
     }); 

     // a new Order which is a child of the parent Customer 
     var newOrder = em.createEntity("Order", { 
      CustomerID: parentCustomer.CustomerID() 
     }); 
     parentCustomer.entityAspect.setUnchanged(); 
     newOrder.entityAspect.setUnchanged(); 

     // clone the EM data 
     var expEntities = em.exportEntities(null, true); 

     //var newEm = newEm(); 
     var newEM = new breeze.EntityManager(); 
     newEM.importEntities(expEntities, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges }); 

     // delete the order 
     var newOrderCopy = newEM.getEntities("Order")[0]; 
     newOrderCopy.entityAspect.setDeleted(); 

     // export the cloned EM 
     var expEntitiesNew = newEM.exportEntities(); 
     // merge to the original EM 
     em.importEntities(expEntitiesNew, { mergeStrategy: breeze.MergeStrategy.OverwriteChanges }); 

     var deletedOrder = parentCustomer.Orders(); 

     ok(newOrder.entityAspect.entityState.isDeleted(), "newOrder should be 'deleted'"); 
     ok(deletedOrder.length === 0, "parentCustomer's 'Orders' should be empty"); 
    }); 
+0

엔티티를 삭제 한 후에 변경 사항을 저장 했습니까? –

+0

아니요, 변경 사항을 저장하지 않았습니다. 하지만 그것은 내가보고 한 버그와 직접적인 관련이 없습니다. – tsdude

+0

나는 다음 주 초에 이것을 재현하려고 노력할 것이다. 또는 breeze zip에서 DocCode 샘플을 사용하여 간단한 repro unit 테스트를 보내 주시면됩니다. –

답변

0

산들 바람 다큐는 샌드 박스 편집 (http://www.getbreezenow.com/documentation/multiple-managers)의 개념을 설명합니다. 이 개념을 모달 대화 상자에 적용하고 싶었습니다. 사용자가 확인 버튼을 클릭 할 때만 메인 윈도우에서 변경 사항을 수락해야합니다. 취소 버튼을 클릭하면 변경 사항이 삭제됩니다.

  • 새로운 EntityManager를 (샌드 박스)을 작성
  • 이 대화 상자에 표시하거나 변경해야 엔티티와 샌드 박스 EntityManager를 채우

    는 단계입니다.
  • 대화 상자를 열고 Sandbox EntityManager를 넘겨줍니다.
  • 사용자가 확인 버튼을 클릭하면 Sandbox EntityManager에서 모든 변경, 추가 및 삭제 된 엔티티를 내보내 주 엔티티 또는 부모 EntityManager로 가져옵니다.
  • 사용자가 취소 버튼을 클릭하면 샌드 박스 EntityManager 만 남겨두고 가비지 수집기가 작업을 수행하게합니다.

삭제 된 엔티티를 주 또는 상위 EntityManager로 전송하는 동안 여기에서 설명한 것과 똑같은 문제가 발생했습니다. 삭제 된

var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted); 
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false); 
mainEm.importEntities(deletedEntitiesExport).entities; 

가져온 개체가 표시됩니다 (EntityState가 삭제됩니다)하지만 그들은 관련 기관의 탐색 속성 제거되지 않습니다.

var deletedEntities = sandboxEm.getEntities(breeze.EntityState.Deleted); 
var deletedEntitiesExport = sandboxEm.exportEntities(deletedEntities, false); 
var deleted = mainEm.importEntities(deletedEntitiesExport).entities; 

// without effect :-(
deleted.forEach(function (e) { 
    e.entityAspect.setDeleted(); 
}); 

I가 삭제 된 개체를 가져 오지 않고 그것을 할 수 있었다 : tsdude 추천

해결 방법은 나를 위해 하지 작업을했다. 나는 삭제 된 개체를 반복하고 삭제 명시 적으로 주요 EntityManger 거기에 대응을 표시 :

sandboxEm.getEntities(breeze.EntityState.Deleted).forEach(function (deleted) { 
    var key = deleted.entityAspect.getKey(); 
    var e = mainEm.getEntityByKey(key); 
    e.entityAspect.setDeleted(); 
}); 

참고 : 브리즈 버전은 1.5.2이다.

+0

이것을 지금보십시오. –

0

오랫동안 복용 해 주셔서 죄송합니다.이 환자는 미끄러졌습니다.

버그 였고 이제 GitHub 레포에서 수정되었습니다. 또한 1.5.3 릴리스에서 나옵니다. ... 그리고 재판에 감사드립니다.

관련 문제