0

从我的 jQuery Ajax 正确调用了我的 Web API Put 方法,但 C# 代码不保存更新。json 对象不具有 MEMBERS 实体的所有属性。上下文不会保存对数据库的任何更改。

public void Update(string id, MEMBERS obj)
    {
        var memToUpdate = context.MEMBERS.Find(obj.MEMBERID);
        if (memToUpdate != null)
        {
            context.Entry(memToUpdate).CurrentValues.SetValues(obj);
            int result = context.SaveChanges();
            System.Diagnostics.Debug.WriteLine("save result:" + result);
        }
    }

此代码将起作用,但是如何使上下文更新 JSON 对象中的 MEMBERS 实体的所有属性而不像这样指定?

public void Update(string id, MEMBERS obj)
    {
        MEMBERS memToUpdate = context.MEMBERS.Find(obj.MEMBERID);
        if (memToUpdate != null)
        {
            //context.Entry(memToUpdate).CurrentValues.SetValues(obj);
            memToUpdate.FIRSTNAME = obj.FIRSTNAME;
            memToUpdate.LASTNAME = obj.LASTNAME;
            int result = context.SaveChanges();
            System.Diagnostics.Debug.WriteLine("save result:" + result);
        }
    }

查询:

var data = {
        MEMBERID: "B745",
        FIRSTNAME: "TESTPUT",
        LASTNAME: "UPDATED WEBAPI"
    };

    var json = JSON.stringify(data)

    $.ajax({
        url: 'api/Members/' + data.MEMBERID,
        type: 'PUT',
        contentType: "application/json; charset=utf-8",
        data: json,
        success: function (results) {
            alert("Success");
        }
    })

我的问题更多关于如何进行 Web API Put 部分更新。我从 oData 中了解了使用 Delta<> 类型的 Patch 方法。我从 nuget 安装了 Web API oData,但 VS 抱怨类型或命名空间 Delta 不存在。有没有人遇到过这个问题?

4

2 回答 2

1

您可以在不使用 Odata 的情况下使用 WebApi 进行部分更新(您确实需要安装库,但 Delta 对象在没有 oData 的情况下似乎可以正常工作)。我会使用 PATCH 而不是 PUT,因为据我了解 PUT 可以替换整个资源,PATCH 是部分 HTTP 动词。

您需要 odata 库(但仅用于 Delta 库,我希望他们将其移出此处并使其更通用,因为它将有用)http://www.nuget.org/packages/Microsoft.AspNet.WebApi。数据

一些代码,不确定这是否会 100% 工作,我的设置略有不同。我确实使用了与您的原始代码类似的东西来促进我的 PUT,但这只是因为 Delta.Put 方法会引发大量错误,我认为这与我的日期有关,无论如何,不​​相关。

    public void Update(string id, Delta<MEMBERS> obj)
    {
        var memToUpdate = context.MEMBERS.Find(obj.MEMBERID);

        if (memToUpdate != null)
        {
            obj.Patch(memToUpdate);
            int result = context.SaveChanges();
            System.Diagnostics.Debug.WriteLine("save result:" + result);
        }
    }
于 2013-08-15T16:02:35.110 回答
0

除非使用 oData,否则 WEB API 似乎无法进行部分更新。我最终不得不调用 GET 方法来取回具有所有属性的整个对象,然后更改我想要的一些属性的值并通过 PUT 方法更新。

$(document).ready(function () {
    $.getJSON('api/Members/B745', function (data) {
        data.FirstName = 'Test Put Success';
        data.LastName = 'My Lastname Is';

        var json = JSON.stringify(data)

        $.ajax({
            url: 'api/Members/' + data.MEMBERID,
            type: 'PUT',
            contentType: "application/json; charset=utf-8",
            data: json,
            success: function (results) {
                alert("Success");
            }
        })

    });
});
于 2013-08-02T15:17:39.967 回答