2017-10-05 167 views
1

我想在EntityFramework核心2.0中的SELECT查詢中使用TransactionScope。但是,我收到此錯誤:「不支持」加入環境事務。「EF核心2.0 TransactionScope錯誤

當我選擇查詢時,這個想法是實現「無鎖定」選項(我知道有這個選項,但它是供應商的要求不是個好主意)。所以我添加的擴展方法(Entity Framework with NOLOCK

public static async Task<List<T>> ToListReadUncommittedAsync<T>(this IQueryable<T> query) 
{ 
    using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, 
     new TransactionOptions() 
     { 
      IsolationLevel = IsolationLevel.ReadUncommitted 
     }, TransactionScopeAsyncFlowOption.Enabled)) 
    { 
     var result = await query.ToListAsync(); 
     scope.Complete(); 
     return result; 
    } 
} 

而且我也已經設置忽略環境事務警告。

public static void AddEntityFramework(this IServiceCollection services, string connectionString) 
{ 
    services.AddDbContextPool<OptomateContext>(options => 
    { 
     options.UseSqlServer(connectionString); 
     options.ConfigureWarnings(x => x.Ignore(RelationalEventId.AmbientTransactionWarning)); 
    }); 
} 

和我有查詢,如下面我的倉庫

public async Task<Patient> GetPatient(Common.Resources.Patient patient) 
{ 
    var pat = await Dbset.Where(x => string.Equals(x.Surname,patient.Surname, 
    StringComparison.CurrentCultureIgnoreCase)).ToListReadUncommittedAsync();          

    return pat.FirstOrDefault(); 
} 

我明白,對.NET核心2.0支持的TransactionScope。但我不知道爲什麼我得到這個例外。

任何想法爲什麼會發生這種情況?

回答

5

System.Transactions沒有在EF核心的支持呢。該問題跟蹤#5595: Enable support for System.Transactionsis committed to be included in the next EF Core release 2.1

在此之前,如果整點要使用與ReadUncommitted的交易,則可嘗試使用明確的EF Core IDbTransactionBeginTransaction(DatabaseFacade, IsolationLevel)擴展方法。不幸的是它不能完全在您的當前自定義擴展方法封裝等,並需要經過DbContext實例:

public static async Task<List<T>> ToListReadUncommittedAsync<T>(this IQueryable<T> query, DbContext context) 
{ 
    using (var transaction = await context.Database.BeginTransactionAsync(System.Data.IsolationLevel.ReadUncommitted))   { 
    { 
     var result = await query.ToListAsync(); 
     transaction.Commit(); 
     return result; 
    } 
} 
0

我發現,不使用事務範圍爲每個查詢一個解決方法。如果您運行下面的代碼,那麼ef將對相同的服務器進程ID使用相同的事務隔離級別。由於服務器進程ID在同一請求中沒有更改,因此每個請求只需要一次調用就足夠了。

​​