通过依赖注入的数据上下文执行异步SaveChangesAsync()时抛出异常
代码如下:
public class DBBookChaptersService : IBookChaptersService
{
private readonly BooksContext _booksContext;
public DBBookChaptersService(BooksContext booksContext)
{ _booksContext = booksContext;}
public async Task Add(BookChapter bookChapter)
{
await _booksContext.Chapters.AddAsync(bookChapter);
await _booksContext.SaveChangesAsync(); //依赖注入的上下文调用异步savechangesAsync后会dispose
}
}
主要原因: 依赖注入的上下文执行到SaveChangesAsync时,会Dispose导致异常
解决方法:
- 使用同步方法SaveChanges().
此方法最简单, 可新构造一个异步方法将其包起来实现异步调用. - 不用依赖注入, 而是临时生成上下文, 具体步骤如下:
此方法并非完全不使用依赖注入, 只是舍弃依赖注入上下文,而使用依赖注入的DbContextOptions来构造临时上下文.
public class DBBookChaptersService : IBookChaptersService
{
private readonly BooksContext _booksContext;
// 1. 采用依赖注入获得DbContextOptions
private readonly DbContextOptions<BooksContext> _options;
public DBBookChaptersService(BooksContext booksContext, DbContextOptions<BooksContext> options)
{
_booksContext = booksContext;
_options = options;
}
public async Task Add(BookChapter bookChapter)
{
// 2. 用optins生成临时上下文, 执行异步SaveChangesAsync()
using (var context = new BooksContext(_options))
{
await context.Chapters.AddAsync(bookChapter);
await context.SaveChangesAsync();
}

本文探讨了在依赖注入的数据上下文中执行异步SaveChangesAsync()时出现的异常问题,主要原因是依赖注入的上下文在SaveChangesAsync执行后被Dispose。文章提供了两种解决方案:一是使用同步SaveChanges()方法;二是利用依赖注入的DbContextOptions创建临时上下文进行异步保存。
1361

被折叠的 条评论
为什么被折叠?



