Estoy tratando de enviar a autorizar la entidad de puestos (con el usuario admin) que tiene una ruta de autorización donde el autorizador es el mismo admin que tiene un expediente activo. El servicio de gestor de flujos de autorización es válida la ruta.
System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Transactions.TransactionException: The operation is not valid for the state of the transaction.
at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction, Guid promoterType)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Guid promoterType)
at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open() --- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
at Aseinfo.VH4.Infraestructura.Workflow.WorkflowFoundationEngine.AsociaInstanciaEntidad(String codigoInstancia, String codigoEntidad, String entitySetName)
at Aseinfo.Infrastructure.Base.Entity.EntityServiceBase`2.AssociateEntityWithWorkflowInstance(T entity, IInstanciaRutaAutorizacion instanciaInicializada, IWorkflowEngine workflowEngine) in C:\vh4\Infrastructure\Base\Entity\EntityServiceBase.cs:line 808
at Aseinfo.Infrastructure.Base.Entity.EntityServiceBase`2.InitializeWorkflowInEntity(IAuthorizationWorkflowManagedEntity entity, IInstanciaRutaAutorizacion instanciaQueSeReintenta) in C:\vh4\Infrastructure\Base\Entity\EntityServiceBase.cs:line 755
at Aseinfo.Infrastructure.Common.Extensions.MvcExtensions.InicializaFlujoAutorizacion(SecuredExtendedControllerBase controller, IAuthorizationWorkflowManagedEntity entity, IAuthorizationWorkflowManagedEntityService service, IInstanciaRutaAutorizacion instanciaQueSeReintenta) in C:\vh4\Infrastructure\Common\Extensions\MvcExtensions.cs:line 579
El procedimiento antes de guardar estaba de la siguiente manera:
ALTER procedure [eor].[puesto_antes_guardar]
@codigo int,
@entitysetname varchar(50),
@accion varchar(10),
@mensaje_validacion varchar(max) out
as
begin
IF @accion='Update'
BEGIN
IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND (pue_estado_workflow != 'Pendiente' OR pue_codigo_workflow IS NOT NULL))
SET @mensaje_validacion = 'No es permitido modificar el puesto porque el estado del flujo no es Pendiente'
END
IF @accion='Update' OR @accion='Insert'
BEGIN
IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo') IS NULL)
SET @mensaje_validacion = 'No se permite campo vacío en el campo Id Cargo'
IF EXISTS (SELECT 1 FROM eor.pue_puestos WHERE pue_codigo=@codigo AND ISNULL(gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd'), '') = '')
SET @mensaje_validacion = 'No se permite campo vacío en el campo Codigo de Job description'
IF EXISTS (
SELECT 1
FROM eor.pue_puestos
WHERE pue_codigo != @codigo
AND gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo') = (
SELECT gen.get_pb_field_data_int(pue_property_bag_data, 'id_cargo')
FROM eor.pue_puestos WHERE pue_codigo=@codigo
)
AND pue_estado='V'
AND (pue_estado_workflow='Autorizado' OR pue_estado_workflow='Pendiente')
AND pue_codigo != ISNULL((SELECT vep_codpue_origen FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo), 0)
)
SET @mensaje_validacion = 'Existe otro cargo con el mismo ID del cargo'
IF EXISTS (
SELECT 1
FROM eor.pue_puestos
WHERE pue_codigo != @codigo
AND gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd') = (
SELECT gen.get_pb_field_data(pue_property_bag_data, 'codigo_jobd')
FROM eor.pue_puestos WHERE pue_codigo=@codigo
)
AND pue_estado='V'
AND (pue_estado_workflow='Autorizado' OR pue_estado_workflow='Pendiente')
AND pue_codigo != ISNULL((SELECT vep_codpue_origen FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo), '')
)
SET @mensaje_validacion = 'Existe otro cargo con el mismo JOB Description'
END
IF @accion='Delete'
BEGIN
IF EXISTS (SELECT 1 FROM tigo.vep_version_puestos WHERE vep_codpue=@codigo OR vep_codpue_origen=@codigo)
SET @mensaje_validacion = 'No es posible elminar debido a que el puesto ya fue Autorizado o ya existe una Copia Autorizada'
END
end
Hola Jimy, Tratamos de reproducirlo pero no lo logramos, creo que necesitaremos más información para lograrlo. Hemos creado puestos con rutas que inician automáticamente y todo funciono bien
Gracias Carlos, he revisado incluso el event viewer en el momento de enviarlo y no encuentro algún error