Return 来自使用 OData 客户端的 OData 操作的数据

Return data from OData Action using OData Client

我正在使用从 http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/OData/v4/ODataActionsSample/ODataActionsSample/ 下载的 ODataActionsSample 作为服务器测试 OData 操作,并调用 "CheckOut" 操作,即

[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);
    }

动作 returns 示例程序中更新了 "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 客户端的调用 returns 没有更新 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());
        }

我的客户端代码有什么问题?

合并选项的默认值是 AppendOnly:没有修改当前值。

OverwriteChanges:所有当前值都被当前存储值覆盖,无论它们是否已更改。

PreserveChanges:已更改的当前值不会被修改,但任何未更改的值都会更新为当前存储的值。此合并中没有丢失任何更改。

所以你必须决定你想要实现哪个选项,在这种情况下我认为 OverwriteChanges 已经足够好了。 仅供参考:https://msdn.microsoft.com/en-us/library/system.data.objects.mergeoption(v=vs.110).aspx