首页 > 解决方案 > 如果项目不存在但以任何方式返回项目的 ID,我如何只发布到 API?

问题描述

我正在向我的 API 发布一个时间表。如果用户选择接收通知,我想将他们的电子邮件存储在一个单独的表中(以规范化的名义!),以便当我排队作业时,我可以参考电子邮件的 ID。

我只想插入不存在的电子邮件,但将电子邮件的 ID 与日程表一起存储在表中。

解决这个问题的最佳方法是什么?我在想需要2个单独的电话吗?

我想我真正需要知道的是,我如何发布并返回电子邮件地址的现有 ID 或新 ID?

// POST /api/email
[HttpPost]
public IHttpActionResult AddToEmails(EmailDto emailDto)
{
    if (!ModelState.IsValid)
        return BadRequest();

    var email = Mapper.Map<EmailDto, EMAILS>(emailDto);

    _context.EMAILS.Add(email);
    _context.SaveChanges();

    emailDto.ID = email.ID;
    return Created(new Uri(Request.RequestUri + "/" + email.ID), emailDto);
}

// POST /api/schedule
[HttpPost]
public IHttpActionResult AddToSchedule(ScheduleDto sequenceDto)
{
    if (!ModelState.IsValid)
        return BadRequest();

    var sequence = Mapper.Map<ScheduleDto, SCHEDULE>(sequenceDto);

    _context.SCHEDULE.Add(sequence);
    _context.SaveChanges();

    sequenceDto.ID = sequence.ID;
    return Created(new Uri(Request.RequestUri + "/" + sequence.ID), sequenceDto);
}

编辑:

@Chris Mack,感谢您的指导。我最终对我的 API 调用进行了更改,它基本上做同样的事情:

// POST /api/email
[HttpPost]
public IHttpActionResult AddToEmails(EmailDto emailDto)
{
    if (!ModelState.IsValid)
       return BadRequest();

    var email = Mapper.Map<EmailDto, EMAILS>(emailDto);
    var emailCheck = _context.EMAILS.SingleOrDefault(
        c => c.EMAIL.ToString().ToUpper() == emailDto.EMAIL.ToString().ToUpper() 
          && c.TYPE == emailDto.TYPE
    );

    if (emailCheck == null)
    {
        _context.EMAILS.Add(email);
        _context.SaveChanges();
        emailDto.ID = email.ID;
    } else
    {
        emailDto.ID = emailCheck.ID;
    }

    return Created(new Uri(Request.RequestUri + "/" + emailDto.ID), emailDto);
}

标签: jqueryasp.netsql-serverajaxapi

解决方案


INSERT我将有一个存储过程,仅当项目不存在时才执行 SQL (使用IF语句),然后返回/选择该项目的 ID(无论它以前是否存在)。然后,您可以在 POST 调用中将该 ID 作为返回值返回。


推荐阅读