2017-10-05 33 views
1

EntityFramework Core 2.0のSELECTクエリでTransactionScopeを使用しようとしています。しかし、私はこのエラーを受け取ります:"アンビエントトランザクションへの参加はサポートされていません。"EFコア2.0 TransactionScopeエラー

アイデアは、私が選択クエリを実行するとき(私はそれが代わりにそのオプションを持つことは良い考えではありません知っているが、それはベンダーの要件です)、「NO LOCK」オプションを実装することです。だから私は、拡張メソッド(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)); 
    }); 
} 

そして、私はネットコア2.0のTransactionScopeをサポートしていることを理解

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

私は自分のリポジトリに次のようにクエリを持っています。なぜこの例外が出るのかわかりません。

なぜこのようなことが起こっているのですか?

答えて

5

System.Transactionsは、EFコアではまだサポートされていません。問題は#5595: Enable support for System.Transactionsis committed to be included in the next EF Core release 2.1によって追跡されます。

これまでのところ、ReadUncommittedでトランザクションを使用する場合は、明示的なEFコア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は同じ要求で変更されないため、各要求に対して1回の呼び出しで十分です。

​​
関連する問題