我从DB我的实体列表中获取,更改一些属性并尝试在DB中更新。
using (var cn = new SqlConnection(ConnectionString))
{
cn.Open();
var dataPredicate = Predicates.Field<Data>(f => f.Id, Operator.Eq, new [] {1, 2, 3}); // of course it's for an example
var data = cn.GetList<Data>(dataPredicate);
foreach (var element in data)
{
element.Status = StatusEnum.Pending;
element.LastChange = DateTime.Now;
}
foreach (var activeRequest in data)
{
cn.Update(activeRequest);
}
cn.Close();
}
我也试过了:
var updated = data.Select(s => new Data
{
Id = s.Id,
CreateDate = s.CreateDate,
ForeignId = s.ForeignId,
LastChange = DateTime.Now,
Status = RequestStatus.Pending
});
我得到 InvalidOperationException:已经有一个与此命令关联的打开DataReader,必须先关闭它。
我对其他操作没有任何问题。
如何正确更新?
答案 0 :(得分:1)
cn.GetList<Data>(dataPredicate)
会返回IEnumerable
,每次与foreach
一起使用时,都会执行实际的sql查询,DataReader
用于向IEnumerable
提供数据。
因此,在您的情况下,您正在执行DataReader
两次,并且第二次尝试Update
查询仍在打开的DataReader
的同一连接时。
如果这是理想的行为(数据太多而您确实希望使用DataReader
逐个加载),则应为Update
查询使用单独的连接。
另一种选择是将所有数据加载到列表中然后通过它迭代,如下所示:
var data = cn.GetList<Data>(dataPredicate).ToList();