2013-10-02 3 views
0

캐시에 엔티티가있는 엔티티는 관련 엔티티를 최상위 20 형태로 포함합니다. 이제 사용자 조치로 서버의 상위 20 개를 업데이트 할 수 있습니다. 전체 엔티티를 다시 다운로드하십시오. 서버는 상위 20 개가 포함 된 올바른 데이터를 전송하지만 Breeze에서는 상위 40 개로 끝납니다 ...이 동작을 피하는 방법을 알 수는 없습니다. 팁을위한Breeze : 병합을 방지하는 방법

감사

업데이트 : 내 앱 고객에게 너무 많은 권한을 제공합니다 나는이 하나로, OData webapi과에 IQueryable를 사용하지 마십시오. 따라서 EntityQuery.fromEntityKey를 사용하고 싶지 않습니다. 이는 내가 원하는 것을 수행하는 것 같습니다. 나는 매개 변수를 추가하는 "일반"쿼리를 계속 사용하는 것을 선호합니다.

업데이트 2 : 병합을 방지하려는 이유에 대한 명확성을 더하기 위해 상위 20 개를 다시 계산할 때 db의 관련 항목을 모두 삭제하고 다시 작성하므로 새 ID를 갖습니다. 그래서 지금은 내 문제를 실제로 해결할 수있는 업데이트를 고려하고 있지만 여전히 병합을 방지 할 수 있는지 알고 싶습니다.

답변

0

정확한 qustion이 무엇인지 확실하지 않지만 엔티티 쿼리에 대해 다른 결과를 얻으려면 다른 액션 이름을 가진 2 개의 다른 컨트롤러를 만들거나 다른 매개 변수 - 오버로드 된 메서드만으로 만들 수 있습니다. 그런 다음 datacontext에서 두 가지 다른 쿼리를 가질 수 있습니다.

쿼리에 .withParameters()를 사용하면 매개 변수가있는 컨트롤러 메서드를 호출 할 수 있습니다.

그런 다음 컨트롤러 메서드에서 원하는 방식으로 LINQ를 사용하여 쿼리하고 필터링 할 수 있습니다. 이 방법을 사용하면 호출 할 쿼리/컨트롤러에 따라 다른 결과를 얻을 수 있습니다.

은 문서 : http://www.breezejs.com/documentation/querying-depth

1

브리즈의 EntityManager는 프라이 머리 키를 기준으로 개체를 캐시합니다. 아마도 두 번째 쿼리는 각 쿼리와 완전히 다른 엔터티 집합을 반환 할 것입니다. 이 경우 사실상 "최신"20 만 원한다면 가장 간단한 해결 방법은 각 쿼리 이전에이 엔티티 유형에 대한 EntityManager 캐시를 비우는 것입니다. 다음과 같음 :

var entities = myEntityManager.getEntities(myEntityType); 
entities.forEach(function(e) { 
    myEntityManager.detachEntity(e); 
    // or 
    // e.entityAspect.setDetached(); 
}); 
관련 문제