我必须在dotnet core 2.0中使用HttpPost更新SQL值

时间:2018-09-05 18:07:01

标签: c# .net-core http-post

我有一个需要使用的外部API资源。该API向我发送触发器作为发布请求。我需要做的是获取值,并更新SQL中的当前对应记录。我提出的代码不断为数据库添加新值。

[HttpPost("status")]
public async Task<IActionResult> Post(CompletionForCreateDto 
completionForCreateDto)
{
    // che ck the model state
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    // find the incoming trigger information and map them to the disctionary
    var form = Request.ReadFormAsync();
    var formData = form.Result;
    Dictionary<string, string> ddata = new Dictionary<string, string>();

    foreach ( var key in formData.Keys)
    {
        var value = formData[key.ToString()];
        ddata.Add(key, value);
    }

    // find the existed completion by ID
    int id = Int32.Parse(ddata["record"]);
    var completion = await repository.GetCompletion(id);

    completion = mapper.Map<CompletionForCreateDto, Completion>(completionForCreateDto);

    if (completion == null)
        return NotFound();

    // some test values to make sure it works.
    completion.VitalSignBLA = ddata["vital_signs_spring_complete"];
    completion.VitalSignBLADateTime = DateTime.Now;

    // repository.Add(completion); ==> adds value as a new record
    // repository.Update(completion);==> adds value as a new record
    repository.Attach(completion); // ==> adds value as a new record

    // SaveChanges()
    await unitOfWork.CompleteAsync();
    return Ok();
}

首先,我得到扳机并将其放入字典中以便可以使用。然后,我尝试使用它们的record值在我的sql servere中找到存在的触发器记录。触发器的record和SQL record的值是相同的值。之后,我使用一些数据对其进行测试。最后,我使用上下文AddUpdateAttach来更新SQL数据库。对于所有情况,发布请求都将添加新行。

我是dotnet核心的新手。我不确定这是因为我使用了HttpPost属性或代码本身。任何帮助都将被申请!

1 个答案:

答案 0 :(得分:1)

EF将实体附加到上下文时(通过附加,更新,添加或通过设置其状态)为实体生成插入语句的最可能原因是PK中缺少值(最常见的是ID,但PK在其他情况下可能会更复杂)。

当不存在PK时,EF无法知道您所指的是哪个实体,因此它将状态设置为“新建”。在您的代码中,我怀疑这是在引起您的问题:

var completion = await repository.GetCompletion(id);
completion = mapper.Map<CompletionForCreateDto, Completion>(completionForCreateDto);

您正在从存储库中获取一些数据,然后通过mapper.Map(completionForCreateDto);生成一个新实体。我怀疑该代码未设置PK值,从而导致了您的问题。天真的解决方法是在mapper.map之后设置这些值。那,或者更新映射以映射值。