2015-08-02 2 views
0

Я тестирование OData Action с помощью ODataActionsSample, который загружается из http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/OData/v4/ODataActionsSample/ODataActionsSample/, как сервер и вызов «Checkout» действие, которое,Возврат данных из OData действий с использованием OData Client

[HttpPost] 
    public IHttpActionResult CheckOut(int key) 
    { 
     var movie = _db.Movies.FirstOrDefault(m => m.ID == key); 
     if (movie == null) 
     { 
      return BadRequest(ModelState); 
     } 

     if (!TryCheckoutMovie(movie)) 
     { 
      return BadRequest("The movie is already checked out."); 
     } 

     return Ok(movie); 
    } 

Действие возвращает фильм с обновленным proprety «DueDate» в примере программы, которая зовёт действия с JavaScript, как показано ниже:

// Invoke "checkout" or "return" action. Both actions take no parameter data. 
    function invokeAction(url) { 
     ajaxRequest("post", url) 
      .done(function (updated) { 
       updateMovie(updated); 
      }) 
      .fail(function (jqXHR, textStatus, errorThrown) { 

       //parent.errorMessage(errorThrown); 
       parent.errorMessage(url); 
      }); 
    } 

    self.update(data); 

    // Update the model with new data from the server. 
    function updateMovie(data) { 
     var dueDate = data.DueDate ? new Date(data.DueDate) : null; 
     self.dueDate(dueDate); 

     if (data["#ODataActionsSample.Models.CheckOut"]) { 
      self.checkoutUrl(data["#ODataActionsSample.Models.CheckOut"].target); 
     } 
     else { 
      self.checkoutUrl(null); 
     } 
     if (data["#ODataActionsSample.Models.Return"]) { 
      self.returnMovieUrl(data["#ODataActionsSample.Models.Return"].target); 
     } 
     else { 
      self.returnMovieUrl(null); 
     } 
    } 

Однако, вызов от клиента OData возвращает фильм без DueDate обновляется. Код клиента выглядит следующим образом:

string serviceUri = "http://localhost:44221/OData/"; 

     var container = new Container(new Uri(serviceUri)); 

     var movieQuery = from movie in container.Movies select movie; 

     DataServiceCollection<ODataActionsClient.Movie> trackedMovies = new DataServiceCollection<ODataActionsClient.Movie>(movieQuery, TrackingMode.AutoChangeTracking, "Movies",null,null); 

     var myMovie = trackedMovies[0]; 

     try 
     { 

      var checkouttedMovie = myMovie.CheckOut().GetValue(); 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.InnerException.ToString()); 
     } 

Что не так с моим кодом на стороне клиента?

+0

DueDate имеет значение null в newMovie является правильным, поскольку метод create не является новым DueDate для newMovie, checkouttedMovie's dueDate тоже нулевой? –

+0

DueDate в newMovie должен быть нулевым. Я сделал неправильный комментарий. Однако DueDate в checkouttedMovie не должен быть нулевым, не так ли? – Matthew

+0

Я обнаружил, что он получает DueDate, если я изменяю MergeOption toMergeOption.PreserveChanges или MergeOption.OverwriteChanges. Это нормальное поведение? – Matthew

ответ

0

Значение по умолчанию для параметра merge равно AppendOnly: текущие значения не изменяются.

OverwriteChanges: Все текущие значения перезаписываются текущими значениями хранилища, независимо от того, были ли они изменены.

PreserveChanges: Текущие значения, которые были изменены, не изменяются, но любые неизменные значения обновляются текущими значениями хранилища. Никакие изменения не теряются в этом слиянии.

Итак, вы должны решить, какой вариант вы хотите достичь, в этом случае я думаю, что OverwriteChanges достаточно хорош. FYI: https://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption(v=vs.110).aspx

Смежные вопросы