文章内容
2018/5/4 14:16:39,作 者: 黄兵
在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。
最近在执行更新的时候,出现了如下错误:
在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。
具体代码如下:
public async TaskSaveZhihuImagesToLocal() { using (UnitOfWork uow = new UnitOfWork()) { var GetALLBlogsId = uow.ZhiHuRepository.GetAll() .Where(x => x.IsDownloadImages == false) .AsNoTracking().Select(x => x.BlogsId); foreach (var item in GetALLBlogsId) { try { //更新Blog表 var ArticleContent = uow.BlogRepository.Get(x => x.Id == item); zhihuContextSave zhihu = new zhihuContextSave(); string NewContent = await zhihu.getZhiHuImagesTaskAsync(ArticleContent.Body); Blog UpdateBlogModel = new Blog(); UpdateBlogModel.ArchivesId = ArticleContent.ArchivesId; UpdateBlogModel.Title = ArticleContent.Title; UpdateBlogModel.Body = NewContent; UpdateBlogModel.CreationTime = ArticleContent.CreationTime; UpdateBlogModel.UpdateTime = ArticleContent.UpdateTime; UpdateBlogModel.AuthorId = ArticleContent.AuthorId; UpdateBlogModel.CategoryId = ArticleContent.CategoryId; UpdateBlogModel.Topics = ArticleContent.Topics; UpdateBlogModel.SEO_Id = ArticleContent.SEO_Id; UpdateBlogModel.Zhihu_Context = ArticleContent.Zhihu_Context; UpdateBlogModel.Draft = ArticleContent.Draft; UpdateBlogModel.Id = ArticleContent.Id; uow.BlogRepository.Update(UpdateBlogModel); uow.SaveChanges(); //更新Zhihus表 var ZhihuItem = uow.ZhiHuRepository.Get(x => x.BlogsId == item); Zhihu ZhihuModel = new Zhihu(); ZhihuModel.Images = ZhihuItem.Images; ZhihuModel.Time = ZhihuItem.Time; ZhihuModel.ZhihuId = ZhihuItem.ZhihuId; ZhihuModel.State = ZhihuItem.State; ZhihuModel.BlogsId = ZhihuItem.BlogsId; ZhihuModel.FirstTitle = ZhihuItem.FirstTitle; ZhihuModel.IsDownloadImages = true; ZhihuModel.Id = ZhihuItem.Id; uow.ZhiHuRepository.Update(ZhihuModel); uow.SaveChanges(); } catch { return false; } } } return true; }
出现以上错误的原因:
data在进行数据的遍历的时候(foreach(){}
),却在遍历中进行data的保存,当然会出错,相当于data同时在遍历和保存,就会提示线程并发。
解决方案:
解决方案一:
把data.savechanges()
写在foreach
外边
解决方案二:
再建一个Entities的对象进行data2.savechanges()
的保存
解决方案三:
在foreach(){}
之前进行tolist()
操作
我是采用的的三种方法,更改后的代码如下:
public async TaskSaveZhihuImagesToLocal() { using (UnitOfWork uow = new UnitOfWork()) { var GetALLBlogsId = uow.ZhiHuRepository.GetAll() .Where(x => x.IsDownloadImages == false) .AsNoTracking().Select(x => x.BlogsId) .ToList(); foreach (var item in GetALLBlogsId) { try { //更新Blog表 var ArticleContent = uow.BlogRepository.Get(x => x.Id == item); zhihuContextSave zhihu = new zhihuContextSave(); string NewContent = await zhihu.getZhiHuImagesTaskAsync(ArticleContent.Body); Blog UpdateBlogModel = new Blog(); UpdateBlogModel.ArchivesId = ArticleContent.ArchivesId; UpdateBlogModel.Title = ArticleContent.Title; UpdateBlogModel.Body = NewContent; UpdateBlogModel.CreationTime = ArticleContent.CreationTime; UpdateBlogModel.UpdateTime = ArticleContent.UpdateTime; UpdateBlogModel.AuthorId = ArticleContent.AuthorId; UpdateBlogModel.CategoryId = ArticleContent.CategoryId; UpdateBlogModel.Topics = ArticleContent.Topics; UpdateBlogModel.SEO_Id = ArticleContent.SEO_Id; UpdateBlogModel.Zhihu_Context = ArticleContent.Zhihu_Context; UpdateBlogModel.Draft = ArticleContent.Draft; UpdateBlogModel.Id = ArticleContent.Id; uow.BlogRepository.Update(UpdateBlogModel); uow.SaveChanges(); //更新Zhihus表 var ZhihuItem = uow.ZhiHuRepository.Get(x => x.BlogsId == item); Zhihu ZhihuModel = new Zhihu(); ZhihuModel.Images = ZhihuItem.Images; ZhihuModel.Time = ZhihuItem.Time; ZhihuModel.ZhihuId = ZhihuItem.ZhihuId; ZhihuModel.State = ZhihuItem.State; ZhihuModel.BlogsId = ZhihuItem.BlogsId; ZhihuModel.FirstTitle = ZhihuItem.FirstTitle; ZhihuModel.IsDownloadImages = true; ZhihuModel.Id = ZhihuItem.Id; uow.ZhiHuRepository.Update(ZhihuModel); uow.SaveChanges(); } catch { return false; } } } return true; }
参考资料:EF并发问题,在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。
黄兵个人博客原创。
评论列表