public async Task <object> GenerateAsync(ISessionImplementor session, object obj, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); var sql = new SqlString(session.Factory.Dialect.SelectGUIDString); try { var st = await(session.Batcher.PrepareCommandAsync(CommandType.Text, sql, SqlTypeFactory.NoTypes, cancellationToken)).ConfigureAwait(false); DbDataReader reader = null; try { reader = await(session.Batcher.ExecuteReaderAsync(st, cancellationToken)).ConfigureAwait(false); object result; try { await(reader.ReadAsync(cancellationToken)).ConfigureAwait(false); result = await(IdentifierGeneratorFactory.GetAsync(reader, identifierType, session, cancellationToken)).ConfigureAwait(false); } finally { reader.Close(); } log.Debug("GUID identifier generated: " + result); return(result); } finally { session.Batcher.CloseCommand(st, reader); } } catch (Exception sqle) { throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "could not retrieve GUID", sql); } }
/// <summary> /// Generate an <see cref="Int16"/>, <see cref="Int32"/>, or <see cref="Int64"/> /// for the identifier by using a database sequence. /// </summary> /// <param name="session">The <see cref="ISessionImplementor"/> this id is being generated in.</param> /// <param name="obj">The entity for which the id is being generated.</param> /// <param name="cancellationToken">A cancellation token that can be used to cancel the work</param> /// <returns>The new identifier as a <see cref="Int16"/>, <see cref="Int32"/>, or <see cref="Int64"/>.</returns> public virtual async Task <object> GenerateAsync(ISessionImplementor session, object obj, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); try { var cmd = await(session.Batcher.PrepareCommandAsync(CommandType.Text, sql, SqlTypeFactory.NoTypes, cancellationToken)).ConfigureAwait(false); DbDataReader reader = null; try { reader = await(session.Batcher.ExecuteReaderAsync(cmd, cancellationToken)).ConfigureAwait(false); try { await(reader.ReadAsync(cancellationToken)).ConfigureAwait(false); object result = await(IdentifierGeneratorFactory.GetAsync(reader, identifierType, session, cancellationToken)).ConfigureAwait(false); if (log.IsDebugEnabled) { log.Debug("Sequence identifier generated: " + result); } return(result); } finally { reader.Close(); } } finally { session.Batcher.CloseCommand(cmd, reader); } } catch (DbException sqle) { log.Error("error generating sequence", sqle); throw ADOExceptionHelper.Convert(session.Factory.SQLExceptionConverter, sqle, "could not get next sequence value"); } }