文章内容

2018/5/4 14:16:39,作 者: 黄兵

在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。

最近在执行更新的时候,出现了如下错误:

在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。

具体代码如下:

public async Task SaveZhihuImagesToLocal()
{
    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 Task SaveZhihuImagesToLocal()
{
    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并发问题,在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - 在提供程序连接上启动事务时出错。有关详细信息,请参阅内部异常。

分享到:

发表评论

评论列表