【问题标题】:.NET API is not inserting into SQL Server, but there are no errors.NET API 未插入 SQL Server,但没有错误
【发布时间】: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


【解决方案1】:

事实证明,EF 不喜欢我用于表和字段的命名约定,因此它无法在键之间建立关系。我已将属性注释为 Key 和 Foreign Key,但在我将属性命名更改为 EF 喜欢的名称后,一切正常。

【讨论】:

    【解决方案2】:

    里面发生了什么

     db.DailyCrewActivities.Add(d);
     db.SaveChanges();
    

    我相信你已经在

    中实现了你的数据库插入逻辑

    SaveChanges()

    您总是获得 Http 状态为 200 的原因在于您始终返回的方法中

    返回确定();

    请添加 SaveChanges() 方法实现

    【讨论】:

    • .SaveChanges() 是实体框架的内置方法。这就是对数据库进行持久性调用的原因
    猜你喜欢
    • 2015-10-23
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2016-12-14
    • 2019-03-16
    • 2014-04-17
    相关资源
    最近更新 更多