【问题标题】:Updating item collection if found in persisted collection如果在持久化集合中找到,则更新项目集合
【发布时间】:2009-12-28 22:29:13
【问题描述】:
public class Item
{
      public int ID {get;set;}
      public string SKU {get;set;
      public int Quantity {get;set;}
}

我从我的数据库中提取项目,例如:

List<Items> savedItems = Db.GetItems();

然后我有这个方法可以接收一组项目:

public void Update(List<Items> items)
{
           // update database
}

传递到 Update 方法中的项目可能已经在数据库中,也可能不在数据库中。必须使用 SKU 属性来完成唯一性。

所以说我在数据库中有:

ID  SKU   qty
1   a      1
2   b      1
3   c      1

现在,如果我将一个项目集合传递给 Update 方法,则有:

ID=?, SKU=d, qty=1

然后它只会插入一个新项目。

如果我传入一个看起来像这样的项目:

ID=?, SKU=b, qty=1

然后我不会插入新项目,但我会更新 ID=2 的项目。

我该怎么做?我是否应该将所有 SKU 值放入一个哈希中,如果它存在,然后以某种方式找到该项目并更新它?

我可以找到不做数据库查找的项目,因为我已经从数据库中提取了项目。

如果该项目已经在数据库中,我必须更新数量。如果它不在数据库中,它只是被插入。

【问题讨论】:

    标签: c# asp.net collections


    【解决方案1】:

    基本上,您想进行检查。首先,您将使用 SKU 值查询数据库中是否存在商品。

    如果数据库中存在该值,那么您将执行更新。

    如果数据库中不存在,您将执行插入。

    你可以有点狡猾并假设更新情况,如下所示:

    update items set ID = ..., qty = ... where SKU = ...
    

    然后,您将检查对命令执行的 ExecuteNonQuery 调用的返回值。如果它返回 1,那么您知道您影响了一条记录并且插入成功。如果返回0,则数据库中不存在该项,需要添加。

    这里的一个单独问题是并发问题。您应该在表格上放置某种时间戳以检查其他人是否在您持有客户端的值时对该项目进行了更改。

    要确保做的另一件事是将其包装在事务中,以便在执行更新/插入时可以保证原子操作。

    最后,出现的问题是,您为什么不使用 LINQ-to-SQL、LINQ-to-Entities、NHibernate 或其他 ORM 类型的解决方案来为您处理所有这些问题?

    【讨论】:

    • 我正在使用 nhibernate :) 只是还没有设置它来做到这一点,看起来很复杂。好的,所以我只是将我的项目填充到字典中并以这种方式检查重复项,谢谢!
    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多