更新项目集合如果在持久性集合
问题描述:
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类型的解决方案来处理所有这些问题?
我正在使用nhibernate :)只是没有设置它来做到这一点,看起来很复杂。好的,我只是将我的项目填充到字典中,并检查重复的方式,谢谢! – mrblah 2009-12-28 22:52:54