此問題實質上是背景關系生命周期的問題, 網上有篇文章對此問題分析的更加詳細, 請參考:
http://www.tnblog.net/aojiancc2/article/details/3283
出問題的代碼如下:
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掉, 導致回呼失敗.
解決辦法:
1. 使用同步方法SaveChanges().
此方法最簡單, 也可以新構造一個異步方法將其包起來實作異步呼叫.
2. 不用依賴注入的背景關系, 而是臨時生成背景關系, 具體步驟如下:
此方法并非完全不使用依賴注入, 只是舍棄依賴注入背景關系,而使用依賴注入的DbContextOptions<T>來構造臨時背景關系.
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(); }
在網友的啟發下, 發現Dispose的原因是背景關系的生命周期問題. 可在注冊服務時將其設為單例模式即可解決:
services.AddDbContext<BooksContext>(options => options.UseSqlServer( Configuration.GetConnectionString("BooksConnection")), ServiceLifetime.Singleton, ServiceLifetime.Singleton);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/59.html
上一篇:EF添加
