PUT 不会在 SQL Server 中插入对象

本文关键字:插入 对象 Server SQL PUT | 更新日期: 2023-09-27 18:32:12

我在使用 Web API 时遇到了问题,我想在 SQL Server 中创建一个新对象。PUT 方法用于更新费用明细。费用明细表包含每日费用明细。每日费用明细包含个人费用。

在 GUI 中,编辑其费用注释的用户可以:

  1. 用值> 0 填写空的单个支出(创建新的单个支出)
  2. 更改现有个人费用
  3. (更新现有个人费用)
  4. 将单个支出/更改值清除为 0(删除现有的单个支出)

在此之后,用户单击保存,整个费用说明将通过 ajax 调用发送到 Web 服务。Nr 2 和 Nr 3 按预期工作,但 Nr 1 不起作用且没有错误。

普特方法

// PUT api/expenses/5
public void Put(int id, [FromBody]Expensenote exUpdate)
{
    expensenote ex = (from e in db.expensenotes
                      where e.ID == id
                      select e).FirstOrDefault();
    if (ex == null)
    {
        //return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Request was not found.");
    }
    else
    {
        foreach (Expensenotedaily d in exUpdate.dailyExpenses)
        {
            var daily = ex.expensenotedailies.SingleOrDefault(da => da.ID == d.ID);
            daily.city = d.city;
            daily.dailyallowance = d.dailyallowance;
            foreach (Expenseindividual i in d.individualExpenses)
            {
                expenseindividual individual = daily.expenseindividuals.SingleOrDefault(ind => ind.ID == i.ID);
                if (i.value == 0)
                {
                    if (!(individual == null))
                    {
                        db.expenseindividuals.Remove(individual);
                    }
                }
                else
                {
                    if (!(individual == null))
                    {
                        individual.value = i.value;
                    }
                    else
                    {
                        expenseindividual newInd = db.expenseindividuals.Create();
                        newInd.typecode_ID = i.expensetypeID;
                        newInd.daily_ID = daily.ID;
                        newInd.typecode = db.typecodes.SingleOrDefault(t => t.ID == i.expensetypeID);
                        newInd.expensenotedaily = daily;
                        newInd.value = i.value;
                        newInd.creditcard = false;
                        db.expenseindividuals.Add(newInd);
                        //SOLUTION: db.SaveChanges();
                    }
                }
            }
        }
        db.SaveChanges();
    }
}

费用单个数据模型类

public partial class expenseindividual
{
    public expenseindividual()
    {
        this.supplementalinfoes = new HashSet<supplementalinfo>();
    }
    public int ID { get; set; }
    public double value { get; set; }
    public bool creditcard { get; set; }
    public int daily_ID { get; set; }
    public int typecode_ID { get; set; }
    public virtual expensenotedaily expensenotedaily { get; set; }
    public virtual typecode typecode { get; set; }
    public virtual ICollection<supplementalinfo> supplementalinfoes { get; set; }
}

调试时,我看到所有属性都正确传递。使用 newInd = new expenseindividual() 而不是 Create() 并不能解决问题。我尝试手动设置 expenseindividual.ID,这使插入工作,但它必须自动递增并启用自动递增。所以我真的很想知道是什么导致了这里的问题以及如何解决它?

PUT 不会在 SQL Server 中插入对象

如果我

理解正确,您正在尝试在尚不存在的情况下将新的费用单插入数据库?

首先。。。此代码当前忽略数据库中尚不存在的支出注释...

expensenote ex = (from e in db.expensenotes
                              where e.ID == id
                              select e).FirstOrDefault();
            if (ex == null)
            {
                //return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Request was not found.");
            }
            else
            {

当您传递数据库中尚不存在的支出通知的 ID 时,ex将始终为 null,因此不会运行任何代码。

惯例是,通常 PUT 始终用于更新记录,在尝试创建记录时使用 POST,但这取决于您。

您需要实现逻辑以在 if 语句中创建新记录,替换注释掉的 return 语句。