Я должен обновить значение SQL с помощью HttpPost в DotNet Core 2.0 - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть внешний ресурс 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();
}

Вверху, сначала я беру триггер и помещаю их в словарь, чтобы я мог его использовать. Затем я попытался найти существующую запись триггера в моем sql servere, используя их значение record. * Триггер record и значение SQL record являются одинаковыми значениями. После этого я использую некоторые данные, чтобы проверить это. Наконец, я использовал контекст Add, Update и Attach для обновления базы данных SQL. Во всех случаях запрос на публикацию сохраняется с добавлением новой строки.

Я новичок в ядре dotnet. Я не уверен в этом, потому что я использовал атрибут HttpPost или сам код. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 06 сентября 2018

Наиболее вероятной причиной того, что EF генерирует оператор вставки для сущности при присоединении его к контексту (через присоединение, обновление, добавление или путем установки его состояния), является отсутствие значений в PK (чаще всего это ID, но PK может быть более сложным в других случаях) для этого объекта.

Когда PK отсутствует, EF не может знать, на какую сущность вы ссылаетесь, поэтому устанавливает состояние New. Я подозреваю, что в вашем коде это вызывает ваши проблемы:

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

Вы получаете некоторые данные из репозитория, но затем генерируете новую сущность с помощью mapper.Map (завершениюForCreateDto) ;. Я подозреваю, что этот код не устанавливает значения PK, вызывая ваши проблемы. Наивным решением было бы установить эти значения после mapper.map. Или обновите сопоставления для сопоставления значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...