如果在持久集合中找到,则更新项集合

时间:2009-12-28 22:29:14

标签: c# asp.net collections

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值放入哈希值(如果存在),然后以某种方式找到该项并更新它?

我可以找到没有进行数据库查找的项目,因为我已经从数据库中提取了项目。

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

1 个答案:

答案 0 :(得分:2)

基本上,你想要检查一下。首先,您将在数据库中查询是否存在具有SKU值的项目。

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

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

你可以稍微改变并假设更新案例,如下:

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

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

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

确保你做的另一件事是将它包装在一个事务中,这样你就可以在执行更新/插入时保证原子操作。

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