更新项目集合如果在持久性集合

问题描述:

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 

现在,如果我通过一个项目收集到的更新方法,即有:

ID=?, SKU=d, qty=1 

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

如果我通过在看起来像一个项目:

ID=?, SKU=b, qty=1 

那么我不会插入一个新的项目,但我将更新ID = 2的项目。

我该怎么做?我应该把所有的SKU值放到一个散列中,如果它存在,那么以某种方式找到它并更新它?

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

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

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

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

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

你可以是一个有点油腔滑调并承担更新的情况下,像这样:

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

你会再检查为ExecuteNonQuery返回值打电话给你的命令去做。如果它返回1,那么你知道你影响了一条记录并且插入成功。如果它返回0,那么该项目不存在于数据库中,您需要添加它。

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

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

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

+0

我正在使用nhibernate :)只是没有设置它来做到这一点,看起来很复杂。好的,我只是将我的项目填充到字典中,并检查重复的方式,谢谢! – mrblah 2009-12-28 22:52:54