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
我正在使用从 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