通过依赖注入的数据上下文执行异步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();
}