【问题标题】:Add method works, Delete / remove does not C# REST API添加方法有效,删除/删除不 C# REST API
【发布时间】:2017-03-18 23:55:03
【问题描述】:

无法让我的删除方法正常工作。 我正在尝试获取它,以便可以使用 Postman 从订单中删除商品。 添加工作正常,删除没有。我一直在尝试谷歌解决方案,但一直在寻找错误的东西。我需要确保根据 lineNumber 和 OrderID 删除项目,这样我就不会在所有订单中删除相同的 lineNumber。

以下是我的添加方法,然后是我当前的删除方法。我有一种感觉,这可能是我还没学过的东西,通常很明显?

           public async Task<short> AddAsync(int orderID, OrderItemDTO item)
    {
        if (item.LineNumber != 0)
        {
            throw new ValidationException("LineNumber is generated and cannot be specified");
        }

        short lineNumber = (short)(_db.OrderItems.Where(oi => oi.OrderID == orderID).Max(oi => oi.LineNumber) + 1);

        _db.OrderItems.Add(new OrderItem()
        {   
            Quantity = item.Quantity,
            OrderID = orderID,
            LineNumber = lineNumber,
            Price = item.Price,
            ProductID = item.ProductID,
            StudentPersonID = item.StudentPersonID
        });

        await _db.SaveChangesAsync();

        return lineNumber;
    }


    public async Task<short> RemoveAsync(int orderID, OrderItemDTO item)
    {
        if (item.LineNumber != 0)
        {
            throw new ValidationException("LineNumber is generated and cannot be specified");
        }

        short lineNumber = (short)(_db.OrderItems.Where(oi => oi.OrderID == orderID).Max(oi => oi.LineNumber));

        _db.OrderItems.Remove(new OrderItem()
        {

            OrderID = orderID,
            LineNumber = lineNumber,

        });


        await _db.SaveChangesAsync();

        return lineNumber;
    }

【问题讨论】:

  • 问题是,你没有列出你看到了什么,如果有的话,你会得到什么错误?你有没有完成你的行动?

标签: c# .net json rest firebase-realtime-database


【解决方案1】:

在我看来,您在方法上方缺少[HttpPost][HttpDelete]

请看参考Microsoft Reference

[HttpPost]
public async Task<short> AddAsync(int orderID, OrderItemDTO item)

[HttpDelete]
public async Task<short> RemoveAsync(int orderID, OrderItemDTO item)

更新1:

public async Task<short> RemoveAsync(int orderID, OrderItemDTO item)
    {
        if (item.LineNumber != 0)
        {
            throw new ValidationException("LineNumber is generated and cannot be specified");
        }

        var objToDelete = _db.OrderItems.Where(oi => oi.OrderID == orderID && oi.LineNumber == item.LineNumber);

        _db.OrderItems.Remove(objToDelete);    

        await _db.SaveChangesAsync();

        return xxx ;  //replace what you want to return
    }

更新 2:

这行代码永远不会从 EF 实体中删除对象,因为您创建了新对象并将其传递给 Remove 方法。 EF 将无法找到要删除的对象。

_db.OrderItems.Remove(new OrderItem()
        {
            OrderID = orderID,
            LineNumber = lineNumber
        });

取而代之的是,首先,您需要获取要从实体中删除的对象。然后传递那个对象。可以写成一行,但为了清楚起见,我会写成两行。

short lineNumber = (short)(_db.OrderItems.Where(oi => oi.OrderID == orderID).Max(oi => oi.LineNumber));

// this will get the object to delete due to your criteria
var objToDelete = _db.OrderItems.Where(oi => oi.OrderID == orderID && oi.LineNumber == lineNumber );

_db.OrderItems.Remove(objToDelete);

await _db.SaveChangesAsync();

return lineNumber;

【讨论】:

  • 添加效果很好,我用过 Postman,它在订单中添加了一个项目就好了,我不相信会这样,我已经看到了参考页面。其他地方也可能有错误,或者我写的删除不正确。
  • Remove 方法返回什么错误或结果?
  • 我在 Visual Studio 中没有收到任何错误,当我为订单 3 第 4 行运行删除时,我在 Postman 上得到一个错误,“ExceptionMessage”:“LineNumber 已生成且无法指定”,“ExceptionType ": "System.ComponentModel.DataAnnotations.ValidationException",
  • 您发布的更新不起作用,因为 LineNumber 从未在 delete 方法中进行。我正在调试别人制作的应用程序,它使用 SQL 数据库来存储信息。我想如果我执行与添加功能相反的操作,我应该能够从订单中删除商品。
  • @dsantrat “我在 Visual Studio 中没有收到任何错误” - 你是否设置了调试器来抛出异常?
【解决方案2】:

我错误地从数据库中删除,然后在它已被删除后再次尝试删除它。更改了代码以在从输入创建对象后将其删除。

【讨论】:

    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多