Dataportal Fetch fails when included around Transactionscope

Dataportal Fetch fails when included around Transactionscope

Old forum URL: forums.lhotka.net/forums/t/7247.aspx


hampole posted on Wednesday, July 08, 2009

I am using .net Framework 3.5 and CSLA 3.5 on XP. I am getting dataportal fetch error when called wrapped around TransactionScope. Here is the error. Please help!

Thanks,
Ravi
here is the code:
                TransactionOptions options = new TransactionOptions();
                options.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
                //options.Timeout = new TimeSpan(0, 30, 0);
                using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, options))
                {
                    success = SaveKioskActivateProcess();

                    if (success)
                        ts.Complete();
                    else
                        ts.Dispose();
                }
Inside the method SaveKioskActivateProcess, I have calls to BOs.

DataPortal Exception: Csla.DataPortalException: DataPortal.Fetch failed (The operation is not valid for the state of the transaction.) ---> Csla.Reflection.CallMethodException: DataPortal_Fetch method call failed ---> 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) 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.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters) at PSI.Applications.RemoteManagement.Dal.RMDBDataContext.usp_GetInActiveKioskList() in c:\remotemanagement\trunc\common\dbconnectionlib\rmdb.designer.cs:line 1317 at PSI.Applications.RemoteManagement.BusinessObjects.InActiveKioskList.DataPortal_Fetch() in C:\RemoteManagement\Trunc\BusinessObjects\BusinessObjectsCustom\KioskManagement\InActiveKioskList.cs:line 49 at dm(Object , Object[] ) at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 221 --- End of inner exception stack trace --- at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) 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.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters) at PSI.Applications.RemoteManagement.Dal.RMDBDataContext.usp_GetInActiveKioskList() in c:\remotemanagement\trunc\common\dbconnectionlib\rmdb.designer.cs:line 1317 at PSI.Applications.RemoteManagement.BusinessObjects.InActiveKioskList.DataPortal_Fetch() in C:\RemoteManagement\Trunc\BusinessObjects\BusinessObjectsCustom\KioskManagement\InActiveKioskList.cs:line 49 at dm(Object , Object[] ) at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 221 at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 225 at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 149 at Csla.Reflection.LateBoundObject.CallMethod(String method) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\LateBoundObject.cs:line 70 at Csla.Server.SimpleDataPortal.Fetch(Type objectType, Object criteria, DataPortalContext context) in C:\Projects\CSLA3.5SP1\cslacs\Csla\DataPortal\Server\SimpleDataPortal.cs:line 124 --- End of inner exception stack trace --- at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) 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.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters) at PSI.Applications.RemoteManagement.Dal.RMDBDataContext.usp_GetInActiveKioskList() in c:\remotemanagement\trunc\common\dbconnectionlib\rmdb.designer.cs:line 1317 at PSI.Applications.RemoteManagement.BusinessObjects.InActiveKioskList.DataPortal_Fetch() in C:\RemoteManagement\Trunc\BusinessObjects\BusinessObjectsCustom\KioskManagement\InActiveKioskList.cs:line 49 at dm(Object , Object[] ) at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 221 at Csla.Reflection.MethodCaller.CallMethod(Object obj, DynamicMethodHandle methodHandle, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 225 at Csla.Reflection.MethodCaller.CallMethod(Object obj, String method, Object[] parameters) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\MethodCaller.cs:line 149 at Csla.Reflection.LateBoundObject.CallMethod(String method) in C:\Projects\CSLA3.5SP1\cslacs\Csla\Reflection\LateBoundObject.cs:line 70 at Csla.Server.SimpleDataPortal.Fetch(Type objectType, Object criteria, DataPortalContext context) in C:\Projects\CSLA3.5SP1\cslacs\Csla\DataPortal\Server\SimpleDataPortal.cs:line 124 at Csla.DataPortal.Fetch(Type objectType, Object criteria) in C:\Projects\CSLA3.5SP1\cslacs\Csla\DataPortal\Client\DataPortal.cs:line 249 at Csla.DataPortal.Fetch[T]() in C:\Projects\CSLA3.5SP1\cslacs\Csla\DataPortal\Client\DataPortal.cs:line 179 at PSI.Applications.RemoteManagement.BusinessObjects.InActiveKioskList.GetInActiveKioskList() in C:\RemoteManagement\Trunc\BusinessObjects\BusinessObjectsCustom\KioskManagement\InActiveKioskList.cs:line 31 at Admin_KioskAdmin_ManageKioskActivateDeactivate.GetInprocessAndPendingCount() in c:\RemoteManagement\Trunc\Web\WebSite\Admin\KioskAdmin\ManageKioskActivateDeactivate.aspx.cs:line 557 at Admin_KioskAdmin_ManageKioskActivateDeactivate.ValidateLicense() in c:\RemoteManagement\Trunc\Web\WebSite\Admin\KioskAdmin\ManageKioskActivateDeactivate.aspx.cs:line 449 at Admin_KioskAdmin_ManageKioskActivateDeactivate.SaveKioskActivateProcess() in c:\RemoteManagement\Trunc\Web\WebSite\Admin\KioskAdmin\ManageKioskActivateDeactivate.aspx.cs:line 371 at Admin_KioskAdmin_ManageKioskActivateDeactivate.btnActivate_Click(Object sender, EventArgs e) in c:\RemoteManagement\Trunc\Web\WebSite\Admin\KioskAdmin\ManageKioskActivateDeactivate.aspx.cs:line 188



Curelom replied on Wednesday, July 08, 2009

Is there a specific reason you are doing a fetch within a transaction? If not, it's best to have a transaction for a fetch.

hampole replied on Wednesday, July 08, 2009

Thanks for your reply.
I am doing multiple records within that method where Fetch is called. I have to update if the record exists, otherwise, I have to create. Also I am checking how many records are active and if they go over the certain limit, I want to rollback. In the fetch, i have this.
private void DataPortal_Fetch()
        {
            bool cancel = false;
            OnFetching(ref cancel);
            if (cancel) return;

            using (var mgr = ContextManager<Dal.RMDBDataContext>
                        .GetManager(Database.RMDB))
            {
                RaiseListChangedEvents = false;
                IsReadOnly = false;

                this.AddRange(
                    from row in mgr.DataContext.usp_GetKioskList()
                    select KioskInfo.GetKioskInfo(row)
                );

                IsReadOnly = true;
                RaiseListChangedEvents = true;
            }//using


            OnFetched();
        }
Am I doing something wrong.

Ravi

Copyright (c) Marimer LLC