在 ASP.NET MVC Core Web API 和 Entity Framework Core 中使用 TryUpdateModel 更新模型不起作用

Jam*_* L. 5 entity-framework-core asp.net-core-mvc asp.net-core-webapi

我是 ASP.NET MVC Core Web API 和 EF Core 的新手,我正在创建一个简单的 MVC Web API 演示,如下所示。

[HttpPut("{id}")]
public async void Put(int id, [FromBody]Student student)
    {
        if (ModelState.IsValid)
        {
            var stu = _context.Students
                .Where(s => s.StudentId == id)
                .SingleOrDefault();

            var updateResult = await TryUpdateModelAsync<Student>(stu, "", s => s.FirstName, s => s.LastName, s => s.EnrollmentDate);
            _context.SaveChanges();
        }

    }
Run Code Online (Sandbox Code Playgroud)

问题是这TryUpdateModelAsync不起作用,更改没有更新到数据库。

我想知道:

  1. 如果TryUpdateModelAsync可以在MVC Web API 中使用?

  2. 我真的不想写像下面这样无聊的代码,如何避免从一个对象到另一个相同类型的对象进行属性值设置?(这是我使用的第一个原因TryUpdateModelAsync

    stu.FirstName = student.FirstName;
    stu.LastName = student.LastName;
    stu.SomeOtherProperties = student.SomeOtherProperties;
    _context.SaveChanges();
    
    Run Code Online (Sandbox Code Playgroud)

.NET 核心版本:1.1.0

ASP.Net 核心版本:1.1.0

实体框架核心版本:1.1.0

Ric*_*SFT 5

网络API通常使用DTO官方文档显示正确的做法。

请参阅GitHub 问题 TryUpdateModelAsync() 不适用于 ASP.NET Core MVC Web API,以获得明确的答案。

[FromBody]属性使用格式化程序将请求正文反序列化为一个对象(例如,使用 JSON 或 XML)。

另一方面,包含TryUpdateModelAPI 的模型绑定使用值提供程序从表单主体(如果有)、查询字符串、路由数据或其他一些地方获取数据。

有几种方法可以到这里:

  1. 您当然可以编写“无聊”的代码。或者您可以考虑使用 AutoMapper 等自动执行“左手/右手”操作的库。
  2. 您可以将发布的数据更改为表单发布,在这种情况下模型绑定将正常工作。
  3. 您可以更改发布的数据以使用 JSON PATCH 协议,该协议正是为此场景创建的。有一篇关于如何使用 ASP.NET Core 做到这一点的很棒的博客文章:http : //benfoster.io/blog/aspnet-core-json-patch-partial-api-updates