ASP.Net 如果数据不存在则添加数据,如果数据存在则更新数据

Posted

技术标签:

【中文标题】ASP.Net 如果数据不存在则添加数据,如果数据存在则更新数据【英文标题】:ASP.Net Add data if data does not exist, if data exist then update data 【发布时间】:2021-12-10 19:05:26 【问题描述】:

当数据已经存在时,我正在尝试创建程序,它将更新数据,如果没有,那么它将添加数据,下面是我的代码.. 更新工作但添加不起作用。如果我删除更新代码,那么添加将起作用

            var itemLocQuantity = objERPMicroDbEntities.ItemLocationDatas.FirstOrDefault(items => items.ItemId == item.ItemId && items.LocationId == item.LocationId);

            if (itemLocQuantity.ItemId == item.ItemId && itemLocQuantity.LocationId == item.LocationId) 
                itemLocQuantity.Quantity += item.QuantityReceive;

            

以上是更新

            if (itemLocQuantity == null)
            
                itemLocQuantity = new ItemLocationData();
                // create new in db
                itemLocQuantity.ItemId = item.ItemId;
                itemLocQuantity.Quantity = item.QuantityReceive;
                itemLocQuantity.LocationId = item.LocationId;
                objERPMicroDbEntities.ItemLocationDatas.Add(itemLocQuantity);

            

以上是尝试添加的代码,但我的程序在尝试添加新数据时返回错误

【问题讨论】:

你能解释一下错误是什么 【参考方案1】:

如果你的整个函数是这样的:

 var itemLocQuantity = objERPMicroDbEntities.ItemLocationDatas.FirstOrDefault(items => items.ItemId == item.ItemId && items.LocationId == item.LocationId);

if (itemLocQuantity.ItemId == item.ItemId && itemLocQuantity.LocationId == item.LocationId) 

    itemLocQuantity.Quantity += item.QuantityReceive;


if (itemLocQuantity == null)

    itemLocQuantity = new ItemLocationData();
    // create new in db
    itemLocQuantity.ItemId = item.ItemId;
    itemLocQuantity.Quantity = item.QuantityReceive;
    itemLocQuantity.LocationId = item.LocationId;
    objERPMicroDbEntities.ItemLocationDatas.Add(itemLocQuantity);

然后,当您进行插入时,问题将是您的更新代码期望返回一个对象,这将失败,因为它发生在 Null 检查之前。您可以反转条件并使用else 条件进行更新:

 var itemLocQuantity = objERPMicroDbEntities.ItemLocationDatas.SingleOrDefault(items => items.ItemId == item.ItemId && items.LocationId == item.LocationId);

if (itemLocQuantity == null) // insert.

    itemLocQuantity = new ItemLocationData();
    // create new in db
    itemLocQuantity.ItemId = item.ItemId;
    itemLocQuantity.Quantity = item.QuantityReceive;
    itemLocQuantity.LocationId = item.LocationId;
    objERPMicroDbEntities.ItemLocationDatas.Add(itemLocQuantity);
 
else  // update.

    itemLocQuantity.Quantity += item.QuantityReceive;

这甚至可以浓缩为:

 var itemLocQuantity = objERPMicroDbEntities.ItemLocationDatas.SingleOrDefault(items => items.ItemId == item.ItemId && items.LocationId == item.LocationId);

if (itemLocQuantity == null) // insert.

    itemLocQuantity = new ItemLocationData();
    // create new in db
    itemLocQuantity.ItemId = item.ItemId;
    itemLocQuantity.LocationId = item.LocationId;
    objERPMicroDbEntities.ItemLocationDatas.Add(itemLocQuantity);
 

itemLocQuantity.Quantity += item.QuantityReceive;

如果我们没有找到一个项目,插入它,然后在它被添加之后,或者如果它已经存在,更新if之外的可更新字段。

此外,如果您要查询并期待一个或零个项目,请使用 SingleOrDefault 而不是 FirstOrDefaultFirst* 方法暗示我期望零或多个,我只关心第一个匹配。他们应该始终使用OrderBy* 子句来确保结果是可重复的。

【讨论】:

非常感谢史蒂夫的解决方案和提示!有效!! .. 试图解决这个问题好几个小时:D

以上是关于ASP.Net 如果数据不存在则添加数据,如果数据存在则更新数据的主要内容,如果未能解决你的问题,请参考以下文章

ASP。 NET MVC 5:如果用户是管理员,则返回所有用户的列表

如何使用 ASP.NET OLEDB 向数据库中添加一行?

MySQL:如果不存在则新增一条数据

有没有办法将元数据添加到 ASP.NET Core 中的所有 GET 端点?

检查firebase数据库中是否存在某个项目,如果该项目不存在,则添加新项目

第二十八篇 asp.net性能优化之使用Redis缓存