2013-11-27 6 views
0

MVC 4 하이브리드 SPA (각 기능은 SPA이지만 기능 간 이동은 페이지를 다시로드 함)를 사용하여 Visual Studio 2012에서 만든 Entity Framework 및 낙관적 동시성 업데이트가 Entity Framework를 통과하지는 않지만 낙관적 인 동시성 프레임 워크를 사용하여 원래 값을 저장하거나 비교할 수 있습니다. 그래서 ... MVC4 ApiController와의 낙관적 동시성

Partial Public Class FS_Item 
    Public Property ItemNumber As String 
    Public Property ItemDescription As String 
    Public Property ItemUM As String 
    ' zillions more properties 
    Private _ItemInventories As ICollection(Of FS_ItemInventory) = New HashSet(Of FS_ItemInventory) 
    Public Overridable Property ItemInventories As ICollection(Of FS_ItemInventory) 
     Get 
     Return _ItemInventories 
     End Get 
     Friend Set(value As ICollection(Of FS_ItemInventory)) 
     _ItemInventories = value 
     End Set 
    End Property 

End Class 

내가 이렇게 같은 ApiController 파생 클래스로 구현 편안한 API를 가지고 ...과 같이, 내 개체 모델을 표현하기 위해

Public Class FSItemController 
    Inherits ApiController 

    Private data As New FSDB() 

    ' GET api/fsitem 
    Public Function GetValues() As IEnumerable(Of FS_Item) 
     Return data.FS_Item.Take(50).ToArray() 
    End Function 

    ' Etc... 

    ' POST api/fsitem 
    Public Sub PostValue(ByVal value As IEnumerable(Of FS_Item)) 
     ' Not implemented yet 
    End Sub 
End Class 

을 포항 강판을 사용하고 SPA를 다음입니다 예제 코드는 일 목록 응용 프로그램, 나는 그리드는 슬릭 기반으로

window.webui = window.webui || {}; 

window.webui.inventorycontext = (function() { 
    var datacontext = { 
     getItems: getItems, 
     getItem: getItem, 
     getNextItem: getNextItem, 
     saveItems: saveItems 
    }; 
    return datacontext; 

    function getItems(itemsObservable, errorObservable) { 
     return ajaxRequest("get", inventoryUrl()) 
      .done(getSucceeded) 
      .fail(getFailed); 
     // ... 
    } 

    // ... 

    function saveItems(items, errorObservable) { 
     return ajaxRequest("post", inventoryUrl(), items) 
      .done(postSucceeded) 
      .fail(postFailed); 

     function postSucceeded(data) { 
      // Not implemented yet 
     } 

     function postFailed() { 
      errorObservable("Error saving items."); 
     } 
    } 

    function ajaxRequest(type, url, data, dataType) { // Ajax helper 
     var options = { 
      dataType: dataType || "json", 
      contentType: "application/json", 
      cache: false, 
      type: type, 
      data: data ? ko.toJSON(data) : null 
     }; 
     var antiForgeryToken = $("#antiForgeryToken").val(); 
     if (antiForgeryToken) { 
      options.headers = { 
       'RequestVerificationToken': antiForgeryToken 
      } 
     } 
     return $.ajax(url, options); 
    } 
    // routes 
    function inventoryUrl(id) { return "/api/FSItem/" + (id || ""); } 
    function inventoryNextUrl(id, next) { return "/api/FSItem/" + (id || "") + "?nextItem=" + next; } 
})(); 

내가 지금 같은 그리드 컨트롤에서 일을 고려하고 데이터를 게시 할 수있는 데이터 컨텍스트 클라이언트 측을 가지고 ... 그리드, 그래서 같은 .viewmodel.js 파일의 save 기능에 의해 추출되어 오는 데이터 ... BTW

self.save = function() { 
    grid.getEditorLock().commitCurrentEdit(); 
    var items = grid.getData().getItems(); 
    datacontext.saveItems(items, error); 
}; 

, 또한 데이터 바인딩에 대한 녹아웃을 사용하고, 나는 jQuery를와의 요소를 포함했다 jquery-ui.

값을 변경하고 값을 변경하고 전체 배열을 서버에 게시하고 디버거에서 업데이트를 보는 데 큰 성공을 거두고 있지만 안전하게 유지하기위한 최적의 방법을 찾지 못했습니다.

마침내 내 질문에. 나는 knockoutjs와 아마도 다른 프레임 워크가 어떤 것인가를 잘 알고있다. _destroy 속성을 삭제 된 객체에 추가하면 서버 코드가 삭제 될 수 있으므로 삭제 된 것으로 처리 할 것이다. 그리고 거기에 낙관적 인 동시성을 사용하여 업데이트 된 개체를 다루는 몇 가지 유사한 규칙이있을 수 있습니다 의심하지만, 거기에있는 경우에도이 정보를 어떻게 서버에 다시 내 서버에 개체 모델을 만들 것이라고 명확하지 않아요. _destroy 또는 다른 객체와 같은 속성을 포함하고 추가하면 아마도 POCO 이상에서 벗어날 것입니다. 맞습니까?

클라이언트가 제출 한 업데이트 된 개체가 마지막 액세스 이후 변경되지 않았 음을 보장하는 올바른 방법은 무엇입니까? 클라이언트가 이미 존재하지 않는다면 원래의 값과 새로운 값을 추적하는 내 자신의 방법을 알아낼 수 있습니다 (어떤 메커니즘이 이미 존재하는지에 대해 알고 싶지만). 하지만 POCO 객체를 오염시키지 않고 그 정보가 ApiController에 전달되는 방법에 난처한 상황입니다. 누구나이 프레임 워크 세트로 낙관적 동시성을 구현 했습니까?

답변

0

나는 내 컨트롤러에 새로운 클래스를 만들었습니다

Public Class PostedFS_ItemData 
    Public Property originals As FS_Item() 
    Public Property updated As FS_Item() 
End Class 

그리고 내 포스트 방법 업데이트 : 이제

Public Sub PostValue(ByVal value As PostedFS_ItemData) 
    'Not implemented yet 
End Sub 

가 내가 키 값을 기준으로 갱신 된 행에 원본 행을 매핑 할 수 있습니다 생각을 , 필요한 것입니다.

관련 문제