Как получить PK нового элемента, созданного в базе данных, для использования сразу и обновить его настройки - PullRequest
0 голосов
/ 10 мая 2019

Я использую веб-API с ASP.NET Core MVC, entityframework и angular в качестве внешнего интерфейса.

В моем угловом приложении у меня есть компонент Stepper https://material.angular.io/components/stepper

На первом шаге я хочу заполнить форму, и как только я нажимаю «Далее», я хочу создать задачу и наВо второй форме я хочу обновить настройки для этой вновь созданной задачи.Однако мне нужно получить PK только что созданной задачи, чтобы обновить настройки во второй форме.

Существует вызов API для создания новой задачи в таблице tTask в sqlserver.

Это мой метод публикации API.

 [ResponseType(typeof(CreatingTaskModel))]
    public IHttpActionResult PosttTask(CreatingTaskModel CreatingTaskModel)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var newtTask= new tTask
        {
            TaskName = CreatingTaskModel.TaskName,
            TaskDescription = CreatingTaskModel.TaskDescription,
            EmailSubject = CreatingTaskModel.EmailSubject,
            EmailBody = CreatingTaskModel.EmailBody,
            FK_TaskTeam = CreatingTaskModel.tTaskTeam.pk_TaskTeam,
            Enabled = CreatingTaskModel.Enabled ? 1:0,

        };
        db.tTasks.Add(newtTask);
        db.SaveChanges();
        var pk = new {id = CreatingTaskModel.PK_Task};

        return Ok("Success");
    }

Это код отправки в угловом формате:

onSubmit()
{
    if(this.taskForm.valid) 
    {
        this.service.createTask(this.taskForm.value).subscribe((data) => {
        debugger;
        console.log(data)
        }) 
    }

}

Я видел, что return Ok () в моем webapi возвращает сообщение, и я думал о сортировке таблицы tTask по убываниюпорядок после db.SaveChanges ();и возвращая последний найденный элемент и отправляя его обратно в Ok (pk), а затем преобразуя его в целое число на моей клиентской стороне и используя его, чтобы получить данные для его обновления.

Как правильно это сделать?Это должно быть сделано в SQL или на веб-интерфейс?

Это то, что я в конечном итоге сделал:

    var newObject = new
    {
        id = newtTask.PK_Task,
        message = "Success"

    };
    return Ok(newObject);

и на угловой у меня это:

 onSubmit(){
    if(this.taskForm.valid) {
      this.service.createTask(this.taskForm.value).subscribe((data) => {
        if(data.message){ 
          if(data.message == "Success"){
            this.getRecipentData(data.id);


this.AdditionalRecipientForm.controls['FK_Task'].setValue(data.id);
            this.pk_Task =  data.id;

          }
        }
        debugger;
        console.log(data)
      }) 
    }

Это просто не кажется практичным, но это делает работу.Что, вы парни, думаете?Должен ли я вместо того, чтобы идти на подачу дважды, может быть, после того, как она закончит заполнять, обе формы отправят их обе?Например, вызвать метод create в моем API, а затем вызвать мой второй API, чтобы обновить данные, представленные во второй форме.Я просто ищу идеи или наиболее распространенную практику для подобных ситуаций.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

После того, как вы добавили его в базу данных и назвали db.SaveChanges, ключ будет присвоен объекту. Итак, после db.SaveChanges вы должны просто ссылаться на newtTask.Id.

0 голосов
/ 10 мая 2019

Итак, я предполагаю, что вы вручную назначаете идентификатор новой задачи через PK_Task = CreatingTaskModel.PK_Task,, и именно этот идентификатор действительно сохраняется в БД.Поэтому столбец идентификатора не должен быть автоинкрементным.

Если это так, вы можете, как сказал ранее Луи, просто вернуть свой объект или только идентификатор, если вас беспокоит пропускная способность.

Вы можетевыполните return new OkObjectResult(pk); или просто используйте сокращение: return Ok(pk);, которое также вернет OkObjectResult с объектом pk в качестве полезной нагрузки.

...