C# 使用实体框架打开的现有dataReader保存更改
我试图从我的数据库中读取一堆音乐曲目,在文件系统中编辑它们,然后将更改保存到数据库中。我正在处理大约200万行,根据我的经验,EF中的大规模更新非常缓慢。再加上如果发生错误,数据库中会有大量不准确的数据 所以我使用了一个查询,然后我得到了该查询的一个枚举器,并将模型发送出去进行工作。在发送了这么多次记录后,我尝试进行必要的更改并保存它们。像这样:C# 使用实体框架打开的现有dataReader保存更改,c#,entity-framework,transactions,datareader,C#,Entity Framework,Transactions,Datareader,我试图从我的数据库中读取一堆音乐曲目,在文件系统中编辑它们,然后将更改保存到数据库中。我正在处理大约200万行,根据我的经验,EF中的大规模更新非常缓慢。再加上如果发生错误,数据库中会有大量不准确的数据 所以我使用了一个查询,然后我得到了该查询的一个枚举器,并将模型发送出去进行工作。在发送了这么多次记录后,我尝试进行必要的更改并保存它们。像这样: foreach (var track in CurrentBatch) { if (track.MusicTr
foreach (var track in CurrentBatch)
{
if (track.MusicTrackFormatID == StartInfo.INPUTFORMATID1)
{
track.MusicTrackFormatID = StartInfo.OUTPUTFORMATID1;
int strLeng= track.MusicTrackPath.Length;
track.MusicTrackPath.Remove(strLeng - 2, 2);
track.MusicTrackPath += StartInfo.OUTPUTFORMATID1.ToString();
}
else
{
track.MusicTrackFormatID = StartInfo.OUTPUTFORMATID2;
int strLeng = track.MusicTrackPath.Length;
track.MusicTrackPath.Remove(strLeng - 2, 2);
track.MusicTrackPath += StartInfo.OUTPUTFORMATID2.ToString();
}
_live.MusicTrackFiles.Find(track.MusicTrackFileID).MusicTrackFilename=track.MusicTrackFilename;
_live.MusicTrackFiles.Find(track.MusicTrackFileID).MusicTrackFilename = track.MusicTrackPath;
}
_live.SaveChanges();
按请求编辑:
稍微描述一下上面的内容_live是一个live数据类型,它继承DbContext。CurrentBatch是MusicTrack文件的列表。MusicTrackFile是表示MusicTrackFiles表中记录的模型
dataReader是使用枚举器生成的,枚举器的使用方式如下:
if (CurrentBatch.Count >= BATCHSIZE)
{
saveBatch();
CurrentBatch.Clear();
}
_queryEnumerator.MoveNext();
CurrentBatch.Add(_queryEnumerator.Current);
return _queryEnumerator.Current;
上述枚举数是从IQueryable中获取的
问题是,我收到一个错误,说明datareader正在使用连接,我需要关闭它。我尝试过使用MARS,我尝试过使用_live.Database.BeginTransaction创建新事务。所有这些都行不通
有没有关于如何保存中期阅读的想法
*注意:我欢迎代码评论什么数据阅读器?你住的是什么类型的?什么是当前批次@reggaeguitar我编辑了我上面的帖子来回答你们的问题,还有更多。