繁体   English   中英

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

[英]I have to update SQL value using HttpPost in dotnet core 2.0

我有一个需要使用的外部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属性或代码本身。 任何帮助都将被申请!

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM