/// <summary>
 ///     <para>
 ///         Called immediately after EF calls <see cref="DbConnection.BeginTransaction(IsolationLevel)" />.
 ///     </para>
 ///     <para>
 ///         This method is still called if an interceptor suppressed creation in <see cref="IDbTransactionInterceptor.TransactionStarting" />.
 ///         In this case, <paramref name="result" /> is the result returned by <see cref="IDbTransactionInterceptor.TransactionStarting" />.
 ///     </para>
 /// </summary>
 /// <param name="connection"> The connection. </param>
 /// <param name="eventData"> Contextual information about connection and transaction. </param>
 /// <param name="result">
 ///     The result of the call to <see cref="DbConnection.BeginTransaction(IsolationLevel)" />.
 ///     This value is typically used as the return value for the implementation of this method.
 /// </param>
 /// <returns>
 ///     The result that EF will use.
 ///     A normal implementation of this method for any interceptor that is not attempting to change the result
 ///     is to return the <paramref name="result" /> value passed in.
 /// </returns>
 public virtual DbTransaction TransactionStarted(
     DbConnection connection,
     TransactionEndEventData eventData,
     DbTransaction result)
 => result;
 /// <summary>
 ///     Called immediately after EF calls <see cref="DbTransaction.RollbackAsync(CancellationToken)" />.
 /// </summary>
 /// <param name="transaction"> The transaction. </param>
 /// <param name="eventData"> Contextual information about connection and transaction. </param>
 /// <param name="cancellationToken"> The cancellation token. </param>
 /// <returns> A <see cref="Task" /> representing the asynchronous operation. </returns>
 public virtual Task TransactionRolledBackAsync(
     DbTransaction transaction,
     TransactionEndEventData eventData,
     CancellationToken cancellationToken = default)
 => Task.CompletedTask;
 /// <summary>
 ///     Called immediately after EF calls <see cref="DbTransaction.Commit" />.
 /// </summary>
 /// <param name="transaction"> The transaction. </param>
 /// <param name="eventData"> Contextual information about connection and transaction. </param>
 public virtual void TransactionCommitted(
     DbTransaction transaction,
     TransactionEndEventData eventData)
 {
 }
 /// <summary>
 ///     Called immediately after EF calls <see cref="DbTransaction.Rollback()" />.
 /// </summary>
 /// <param name="transaction"> The transaction. </param>
 /// <param name="eventData"> Contextual information about connection and transaction. </param>
 public virtual void TransactionRolledBack(
     DbTransaction transaction,
     TransactionEndEventData eventData)
 {
 }
 /// <summary>
 ///     <para>
 ///         Called immediately after EF calls
 ///         <see cref="M:System.Data.Common.DbConnection.BeginTransactionAsync(System.Data.IsolationLevel,System.Threading.CancellationToken)" />
 ///         .
 ///     </para>
 ///     <para>
 ///         This method is still called if an interceptor suppressed creation in <see cref="IDbTransactionInterceptor.TransactionStarting" />.
 ///         In this case, <paramref name="result" /> is the result returned by <see cref="IDbTransactionInterceptor.TransactionStarting" />.
 ///     </para>
 /// </summary>
 /// <param name="connection"> The connection. </param>
 /// <param name="eventData"> Contextual information about connection and transaction. </param>
 /// <param name="result">
 ///     The result of the call to
 ///     <see cref="M:System.Data.Common.DbConnection.BeginTransactionAsync(System.Data.IsolationLevel,System.Threading.CancellationToken)" />.
 ///     This value is typically used as the return value for the implementation of this method.
 /// </param>
 /// <param name="cancellationToken"> The cancellation token. </param>
 /// <returns>
 ///     A <see cref="Task" /> providing the result that EF will use.
 ///     A normal implementation of this method for any interceptor that is not attempting to change the result
 ///     is to return the <paramref name="result" /> value passed in, often using <see cref="Task.FromResult{TResult}" />
 /// </returns>
 public virtual ValueTask <DbTransaction> TransactionStartedAsync(
     DbConnection connection,
     TransactionEndEventData eventData,
     DbTransaction result,
     CancellationToken cancellationToken = default)
 => new ValueTask <DbTransaction>(result);