我有一个需要使用的外部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
的值是相同的值。之后,我使用一些数据对其进行测试。最后,我使用上下文Add
,Update
和Attach
来更新SQL数据库。对于所有情况,发布请求都将添加新行。
我是dotnet核心的新手。我不确定这是因为我使用了HttpPost
属性或代码本身。任何帮助都将被申请!
答案 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之后设置这些值。那,或者更新映射以映射值。