【发布时间】:2020-02-03 01:02:54
【问题描述】:
我有一个 ASP.NET MVC 应用程序,我添加了 Web API 以接收 Json 并将内容插入 SQL Server。在移动 Cordova 应用程序和 Rest Api 测试中,我的 Http 状态为 200。但是没有插入记录。
这是班级和DBContext:
public class MobileController : ApiController
{
private PTSContext db = new PTSContext();
//all the code....
}
我创建了这个类来处理来自 Http 请求的 json body。
public class DailyCrewActivityJson
{
[JsonProperty("api_id")]
public string api_id { get; set; }
[JsonProperty("api_daily_crew_id")]
public string api_daily_crew_id { get; set; }
[JsonProperty("api_contract_id")]
public string api_contract_id { get; set; }
[JsonProperty("api_contract_task_id")]
public string api_contract_task_id { get; set; }
}
我有这个类来处理插入。
[HttpPost]
[Route("api/mobile/insertdailycrewactivity")]
public IHttpActionResult InsertDailyCrewActivity([FromBody] DailyCrewActivityJson crewActivityJson)
{
DailyCrewActivity d = new DailyCrewActivity();
d.id = crewActivityJson.api_id;
d.daily_crew_id = crewActivityJson.api_daily_crew_id;
d.contract_id = crewActivityJson.api_contract_id;
d.contract_task_id = crewActivityJson.api_contract_task_id;
db.DailyCrewActivities.Add(d);
db.SaveChanges();
return Ok();
}
这种模式看起来不错吗?我尝试从高级 REST 客户端手动执行 POST,但仍然没有收到插入或错误消息。
这是我的 url 和我的 json 正文的样子:
https://<my url.com>/api/mobile/insertdailycrewactivity
JSON:
{
"api_id": "74849939162039260-1569958529936",
"api_daily_crew_id": "21273665486597612-1569862557128",
"api_contract_id": "eef03be7-82b9-4066-93d9-cb64d346481c",
"api_contract_task_id": "00407436-2450-4f40-9323-29860232e8f7",
}
编辑 2019 年 10 月 5 日 我将站点移动到本地并将 SQL 数据库恢复到本地 SQL Express。当我运行网站并调用
http://localhost/api/mobile/insertdailycrewactivity
我可以单步执行那个 web api 方法。我的错误发生在 db.SaveChanges 方法中。
错误来自 System.Collections.ListDictionaryInternal 并指出“{Invalid column name 'DailyCrew_id'}” 我没有具有该名称的列。我确实有一个名为“daily_crew_id”的列,并且我有一个名为“DailyCrew”的表,其中包含一个“id”字段。 'DailyCrew_id' 会是内部列表中的名称吗? 我不知道去哪里寻找或如何解决这个问题。
【问题讨论】:
-
您使用的模式看起来是正确的。您新建一个 EF 类,设置属性,将其添加到 Entity 类的子类 (DailyCrewActivities) 和
.SaveChanges()。这就是你在这里所做的......这是完整的方法吗?您是否有任何您没有显示的验证?db.对象怎么样?在哪里以及如何声明? -
如果您无法访问远程环境,您可以随时将诊断信息放入您的 HTTP 响应中。尤其要确保您的数据库连接指向您期望的位置。
-
为什么要在远程进行故障排除?是因为它在本地工作而不是远程工作吗?如果是这样,可能是环境之间的配置差异;否则,您应该尝试在本地进行故障排除,您可以在其中逐步执行代码。现在,无论服务器上发生什么,您都会返回 200OK,因此您应该更新它,并在响应中返回完整的异常(如果存在)。
-
@Ryan 如果我可以提出建议,请养成在您的项目中设置日志记录的习惯,尤其是如果这些项目在远程环境中运行。记录到文件或数据库。 log4net、Serilog 和 NLog 都是这方面的优秀库,但还有其他库。当远程环境中发生严重事情时,这将使您更好地了解为什么。
-
另外,模式方面,DBContext 实现了 IDisposable。像这样在控制器顶部声明它的方式,您需要确保在某处完成后调用 Dispose() 。您的其他选择可以是使用
using语句在每个控制器方法中创建数据库上下文,或者您可以实现类似Unity Dependency Injection的东西,它管理对象的生命周期并为您处理它。不对对象调用 dispose 会导致内存泄漏。
标签: c# json sql-server asp.net-mvc asp.net-web-api