EF Core怪問題之通過依賴注入獲取的上下文在執行異步寫入數據庫時拋出異常?


此問題實質上是上下文生命周期的問題, 網上有篇文章對此問題分析的更加詳細, 請參考:

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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM