swagger 如何在.NET Core Web API中对具有外键的DB表进行POST/PATCH/PUT?

qxsslcnc  于 2023-10-18  发布在  .NET
关注(0)|答案(2)|浏览(156)

我试图在.NET Core Web API中为包含外键的数据库表创建POST、PATCH和PUT方法。我不确定问题是出在我的方法上,还是出在我在swagger上测试我的方法的方式上。我的方法对于同一个数据库中不包含外键的表工作得很好。
我的DB表托管在SQL Server上,并将CustomerId作为外键。当我在Swagger上测试我的POST方法时,我收到一个400错误,指出“The Customer field is required”。
My Request Body on Swagger
The error message I receive
Visual Studio中的POST方法如下:

[HttpPost]
public async Task<ActionResult<Order>> PostOrder(Order order)
{
    if (_context.Orders == null)
    {
        return Problem("Entity set 'ecopowerdatabaseContext.Orders'  is null.");
    }
    _context.Orders.Add(order);
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
        {
        if (OrderExists(order.OrderId))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }

    return CreatedAtAction("GetOrder", new { id = order.OrderId }, order);
}

我已经修改了请求主体,以包括引用的客户字段的所有信息,但当我这样做时,我得到了一个冲突错误,因为它试图用已经存在的ID发布到客户表。

t8e9dugd

t8e9dugd1#

在填充订单之前,您必须首先检索Customer实体。

var customer = await _context.Customers.FirstOrDefaultAsync(c => c.CustomerId == order.CustomerId);

    if(customer == null) {
        return BadRequest();
    }

    order.Customer = customer;

所以,你可以像这样编辑你的方法:

[HttpPost]
public async Task<ActionResult<Order>> PostOrder(Order order)
{
    if (_context.Orders == null)
    {
        return Problem("Entity set 'ecopowerdatabaseContext.Orders'  is null.");
    }
    
    var customer = await _context.Customers.FirstOrDefaultAsync(c => c.CustomerId == order.CustomerId);

    if(customer == null) {
        return BadRequest();
    }

    order.Customer = customer;
    
    _context.Orders.Add(order);
    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
        {
        if (OrderExists(order.OrderId))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }

    return CreatedAtAction("GetOrder", new { id = order.OrderId }, order);
}
zbwhf8kr

zbwhf8kr2#

我找到了解决办法。如果我将订单所需的字段添加到方法的输入参数中,以便在Swagger中将它们显式地输入到它们自己的单独文本框中,那么问题似乎就解决了。而不是将订单对象作为输入参数-因为对象还不存在。然后,我在方法中创建一个新的Order对象,并在将新的order对象传递给Add()方法之前分配所有必需的属性。正确的代码如下:

[HttpPost]
public async Task<ActionResult<Order>> PostOrder(short OrderId, 
DateTime OrderDate, short CustomerId, string Address)
{
    if (_context.Orders == null)
    {
        return Problem("Entity set 'ecopowerdatabaseContext.Orders'  
        is null.");
    }

    Order order = new Order();
    order.OrderId = OrderId;
    order.OrderDate = OrderDate;
    order.CustomerId = CustomerId;
    order.DeliveryAddress = Address;

    _context.Orders.Add(order);
    try
    {
        await _context.SaveChangesAsync();          
    }
    catch (DbUpdateException)
    {
        if(OrderExists(order.OrderId))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }
    return CreatedAtAction("GetOrder", new { id = order.OrderId }, 
    order);
}

相关问题