2013-03-07 2 views
2

기존의 모든 breezej 예제가 BreezeController 사이의 엔티티 모델을 전달하는 것 같습니다.SaveChanges()는 BreezeController에서 어떻게 호출됩니까?

그러나 제작 된 거의 모든 페이지는 일부 형식의보기 모델을 사용하고 있습니다. 우리는 BreezeJ가없는 시대에 데이터 (도메인 모델)를 저장소에서 검색하여 (AutoMapper를 사용하거나 수동으로) 해당 뷰에 필요한 데이터 만 포함하는 뷰 모델을 채 웁니다. WebAPI는 클라이언트 측 뷰 모델 (일반적으로 knockout 관찰 가능)을 채울 수있는 브라우저로 뷰 모델 데이터 만 보냅니다.

데이터를 저장할 때 <form>에서 데이터를 수집하여 입력보기 모델을 채우고 해당 데이터 만 서버로 보내면 입력보기 모델의 데이터는 도메인 모델에 매핑됩니다. 업데이트는 저장소의 DbContext 엔터티에 SaveChanges()을 호출하여 저장됩니다.

이제 BreezeJsEFContextProvider을 생성하여 Google의 모든 저장소 코드를 인계받습니다. 내가 본 예는 일반적으로 도메인 모델 데이터를 검색 한 다음 클라이언트 측에 모두 전달합니다.

[HttpGet] 
    public IQueryable<Item> Items() { 
     return _contextProvider.Context.Items; 
    } 

뷰 모델을 작성하는 것은 클라이언트 측 javascript의 작업입니다.

[HttpGet] 
public List<ItemViewModel> Items() { 
    var items = _contextProvider.Context.Items 
        .Include("RelatedEntity") 
        .ToList(); 
    var model = new List<ItemViewModel>(); 
    .... some code to build model from items .... 
    return model; 
} 

장점은 적은 데이터가 네트워크를 통해 전송되는 것입니다, 우리는 서버 측에서 많은 조작을 수행 할 수 있습니다 우리는 서버 측에서 뷰 모델을 구축하는 과정의

가 가능하다 . 그러나 이것을 BreezeController처럼 수정하는 것이 좋은 실행인지 여부는 알 수 없습니다. 그러나 적어도 모든 항목을 나열하는 데 필요한 데이터를 반환합니다.

POST 데이터를 다시 보내려고하면 실제 문제가 발생합니다.

내가 발견 한 BreezeJs 예제에서는 을 사용하여 모든 도메인 모델 데이터를 저장합니다 (예 : vm.items). 그런 다음 새 레코드 newItemmanager.createEntity에 의해 도메인 모델로 빌드됩니다. 데이터 유효성을 확인한 후 item.entityAspect.validateEntity()을 입력하면 이 vm.items으로 푸시되고 manager.saveChanges()이 호출되어 BreezeController에서 SaveChanges()을 호출합니다.

[HttpPost] 
    public SaveResult SaveChanges(JObject saveBundle) { 
     return _contextProvider.SaveChanges(saveBundle); 
    } 

너무 많은 것들이 인계되었습니다. (. 당신이 동의하지 않는 경우 나 웃음) 내 질문은 :

  1. 수 있습니까 단지 createEntity 다음 saveChanges? 입력하고 제출할 빈 양식 만 있습니다. 클라이언트 쪽에서 전체 items 배열을 만들 필요는 없습니다.

  2. JObject으로 입력보기 모델을 전달하고 _contextProvider.SaveChanges()을 호출하기 전에 서버 측 처리를 수행 할 수 있습니까?


이 다시 슈퍼 긴 포스트 것으로 밝혀졌습니다. 모든 것을 읽어 주셔서 감사합니다. 정말 감사합니다!

답변

5

좋은 질문입니다.불행히도, 우리 데모 코드는 클라이언트와 서버 모두에서 Breeze의 실제 기능을가 렸습니다. Breeze는 두려움에 제약을받지 않습니다.

설명서에있는 모든 내용을 반복하고 싶지는 않습니다. 우리는이 문제들에 관해 정말로 이야기합니다. 확실한 예가 더 필요합니다.

CQRS 디자인에 대해 설명하고 있습니다. 나는 그것이 대부분의 어플리케이션을 복잡하게 만든다고 생각합니다. 그러나 그것은 당신의 특권입니다.

Item 대신 ItemViewModel을 보내려면 다음을 입력하십시오. 이를 Breeze 클라이언트의 엔티티로 처리하려면 EntityManager을 KO 관찰 가능으로 설정하고 캐시에서 관리하고 변경 사항을 추적하고 유효성을 검사합니다. 메타 데이터를 제공해야합니다. 서버 또는 클라이언트에서. 이는 Breeze와 다른 모든 시스템 (Ember, Backbone 등)에 적용됩니다. 곧 임의의 CLR 모델에 대해 서버에서 메타 데이터를 쉽게 만들 수 있습니다. 그게 도움이 될거야.

Item 또는 ItemViewModel이든간에 서버에 대한 쿼리 (btw)를 완전히 제어 할 수 있습니다. 둘 중 하나에 대해 개방형 쿼리를 노출 할 필요는 없습니다. 당신은 당신의 2 번째 예제 쿼리 덕분에 그것을 아는 것 같습니다.

켜짐 면에 있습니다.

당신이 쓴 : 정확하게 사실이 아니다

"가 [예]는 ko.observableArray()는 모든 도메인 모델 데이터를 저장의이 vm.items에게 말할 수 있도록 사용". 예제에서 볼 수있는 items 배열은 프리젠 테이션에 대해 존재합니다. items 배열에 Breeze 퍼스펙티브의 내용이 저장되지 않습니다. 실제로 질의 후 질의 응답에서 반환 된 엔티티 (엔티티 인 경우)는 배열 결과에 관계없이 쿼리의 결과에 관계없이 이미 관리자의 캐시에 있습니다. 배열은 관리자의 엔티티 추적에 아무런 역할도하지 않습니다..

당신은 썼다 : "수 있습니까 단지 createEntity 다음 saveChanges?"

물론

! EntityManager.createEntity 메서드는 캐시에 새 엔터티를 넣습니다. 다시 말하지만, items 어레이에 푸시 된 것을 보는 이유는 사용자에게 표시하기위한 것입니다. 이 배열은 관리자가 저장할 항목에 아무런 영향을 미치지 않습니다.

당신은 썼다 : "내가 입력 뷰 모델을 통과 ... 그리고 _contextProvider.SaveChanges()를 호출하기 전에 일부 서버 측 처리를 할 수?"

난 당신이 "입력 뷰 모델"에 의해 무슨 뜻인지 모르겠어요 . Breeze EntityManager 엔티티를 추적합니다. "입력보기 모델"이 엔티티 인 경우 EntityManager이이를 추적합니다. 변경된 경우 saveChanges으로 전화하면 관리자가 컨트롤러의 SaveChanges 메소드로 전송합니다.

사용자는 컨트롤러의 SaveChanges 메소드 구현을 소유하고 있습니다. JObject은 변경 세트 데이터의 JSON.NET 표현 인 원하는 모든 것을 할 수 있습니다. ContextProvider이 해당 개체를 구문 분석하여 SaveMap으로 작업하는 것이 도움이 될 것이라고 생각합니다. topic on Customizing the EFContextProvider을 읽으십시오.대부분의 사람들은 이것이 데이터를 데이터 액세스 레이어로 전달하기 전에 클라이언트 변경 세트 데이터의 유효성을 검사하고 조작하는 데 필요한 것을 제공한다고 생각합니다. 그것이 EF이든 다른 것이 든 상관 없습니다.

대신 자신 만의 맞춤형 컨트롤러 메서드에 POST 할 사용자 지정 DTO를 만들려면 ... 바로 시작하십시오. 그래도 EntityManager.saveChanges으로 전화하지 마십시오. EntityManager.getChanges()으로 전화하여 변경된 엔티티 배열을 DTO로 조작하십시오. 당신은 모든 것을 손으로 할 것입니다. 하지만 넌 할수있어. 개인적으로 할 일이 더 좋을 것 같습니다.

관련 문제