如何使用Dapper扩展更新数组?

时间:2014-02-25 19:10:21

标签: c# .net invalidoperationexception dapper-extensions

我从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,必须先关闭它。

我对其他操作没有任何问题。

如何正确更新?

1 个答案:

答案 0 :(得分:1)

cn.GetList<Data>(dataPredicate)会返回IEnumerable,每次与foreach一起使用时,都会执行实际的sql查询,DataReader用于向IEnumerable提供数据。

因此,在您的情况下,您正在执行DataReader两次,并且第二次尝试Update查询仍在打开的DataReader的同一连接时。

如果这是理想的行为(数据太多而您确实希望使用DataReader逐个加载),则应为Update查询使用单独的连接。

另一种选择是将所有数据加载到列表中然后通过它迭代,如下所示:

var data = cn.GetList<Data>(dataPredicate).ToList();