.NETAPI更新包括ID我来自RubyonRailsAPI背景,但我目前正在开发.NETC#WebAPI。我熟悉C#和.NET网络表单。我正在尝试设置一个PUT请求来更新数据库中的记录。脚手架方法覆盖所有字段,而我只想更新通过PUT传递的字段。我尝试使用以下代码://PUT:api/Users/5[ResponseType(typeof(void))]publicIHttpActionResultPutUser(stringid,Useruser){if(!ModelState.IsValid){returnBadRequest(ModelState);}用户userToUpdate=db.Users.Where(u=>u.id==id).FirstOrDefault();如果(userToUpdate==null){returnNotFound();}db.Entry(userToUpdate).CurrentValues.SetValues(user);尝试{db.SaveChanges();}catch(DbUpdateException){if(UserExists(id)){returnConflict();}else{扔;}}返回StatusCode(HttpStatusCode.NoContent);db.SaveChanges()失败,因为它无法覆盖作为键的“id”。put请求是content-type:application/json并且json如下:{"preferredEmailUpdates":"true"}这需要应用于所有字段并接受空条目。所以下面也是有效的,应该用null更新字段调用。{"preferredEmailUpdates":"true","phone":null}如何在不更新密钥的情况下更新这些值?您可以考虑使用PATCHHTTP动词和Delta对象。[AcceptVerbs("Patch"),ResponseType(typeof(void))]publicIHttpActionResultPatchUser(stringid,Deltachanges){UseruserToUpdate=db.Users.Where(u=>u.id==id).FirstOrDefault();如果(userToUpdate==null)返回NotFound();变化.补丁(userToUpdate);尝试{db.SaveChanges()}catch(DbUpdateException){...}returnStatusCode(HttpStatusCode.NoContent);另请参阅使用Delta的EasyASP.NETWebAPI资源更新。您的更新模型(用户请求绑定到的类)应该与您的数据库模型分开(因为它代表不同的概念)。它可以使用可空/可能字段来指示可能的更改。它还会隐藏您不希望用户更改的字段(例如时间戳)。然后您可以使用反射仅更新修改的字段。考虑使用AutoMapper等现成的库usingSystem;使用System.Reflection;使用WhateverNamespaceIsNeededForWebApiAndEF;公共类UserUpdate{公共字符串名称{get;设置;}公共布尔?PreferredEmailUpdates{get;设置;}}公共类用户{公共intId{get;设置;}公共字符串名称{get;设置;}publicboolPreferredEmailUpdates{get;设置;}公共DateTimeOffsetCreationDate{get;设置;}}[ResponseType(typeof(void))]publicIHttpActionResultPutUser(stringid,UserUpdatecommand){if(!ModelState.IsValid){returnBadRequest(ModelState);}用户userToUpdate=db.Users.Where(u=>u.id==id).FirstOrDefault();如果(userToUpdate==null){returnNotFound();}//这是重要的代码PropertyInfo[]propInfos=command.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);foreach(propInfos中的varp){objectvalue=p.GetValue(command);if(value!=null){userToUpdate.GetType().GetProperty(p.Name).SetValue(userToUpdate,value);}}//结束重要代码尝试{db.SaveChanges();}catch(DbUpdateException){if(UserExists(id)){returnConflict();}else{扔;}}返回StatusCode(HttpStatusCode.NoContent);}另一种情况是——为什么要更新单个字段?能够在不更新密码的情况下更新电子邮件首选项是正常的,但是单独更新所述首选项的每个字段是否正常?我对此表示怀疑。考虑将API拆分成块,就像在OOP中拆分大型接口一样。以上就是C#学习教程:.NETAPI更新包含ID分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权请点击右侧联系管理员删除。如需转载请注明出处:
