【问题标题】:ASP.Net Add data if data does not exist, if data exist then update dataASP.Net 如果数据不存在则添加数据,如果数据存在则更新数据
【发布时间】: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);

            }

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

【问题讨论】:

  • 你能解释一下错误是什么

标签: c# asp.net entity-framework model-view-controller entity-framework-core


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2015-12-17
  • 1970-01-01
  • 2014-05-05
  • 2017-04-24
  • 1970-01-01
  • 2016-11-19
相关资源
最近更新 更多