Domanda

come posso gestire eccezione che viene generata nel metodo NHibernate Flush? Ho un azione per eliminare gli oggetti. Si carica gli oggetti dal repository utilizzando gli ID distaccati e le chiamate repository.Delete(obj).

Al di là che la mia mappatura NHibernate non è completa ed i risultati di eliminazione in "L'istruzione DELETE in conflitto con vincolo RIFERIMENTO" eccezione, questo è un buon caso di attuare la hadling eccezione per questo caso.

Così l'eccezione viene generata nel filo e il filo viene chiamato in UnitOfWorkPerRequestTask, che è attività creata e distrutta a ogni richiesta e inizia e svuota l'UnitOfWork (Rhino.Commons.UnitOfWork). Questo compito è stato registrato utilizzando Windsor contenitore e LifestyleType.Transient ed è chiamato da HttpApplication all'interno Begin e metodi EndRequest.

C'è un modo come gestire questa eccezione nella mia azione di eliminazione, in modo da poter notare utente che l'oggetto non può essere eliminato a causa di alcune relazioni?

L'analisi dello stack eccezione è qui (non completo):

NHibernate.Transaction.AdoTransaction.Commit() +212
Rhino.Commons.NHibernateTransactionAdapter.Commit() +33
Rhino.Commons.BaseUnitOfWorkFactory.TransactionalFlush(IsolationLevel isolationLevel) +116
Rhino.Commons.BaseUnitOfWorkFactory.TransactionalFlush() +35
Cereal.Mvc.DataModule.Tasks.UnitOfWorkPerRequestTask.DisposeCore() in C:\projects\Sample\Cereal.Mvc.DataModule\Tasks\UnitOfWorkPerRequestTask.cs:33
System.Web.Mvc.Extensibility.Disposable.Dispose(Boolean disposing) in C:\projects\System.Web.Mvc.Extensibility\Abstraction\Disposable.cs:52
System.Web.Mvc.Extensibility.Disposable.Dispose() in C:\projects\System.Web.Mvc.Extensibility\Abstraction\Disposable.cs:35
Castle.MicroKernel.LifecycleConcerns.DisposalConcern.Apply(ComponentModel model, Object component) +47
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ApplyConcerns(Object[] steps, Object instance) +129
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ApplyDecommissionConcerns(Object instance) +106
Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalDestroy(Object instance) +37
Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Destroy(Object instance) +37
Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Release(Object instance) +48
Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleManager.Evict(Object instance) +38
Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule.Application_EndRequest(Object sender, EventArgs e) +305
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

Grazie per l'aiuto.

È stato utile?

Soluzione

Se si chiama Flush () in un'UnitOfWork, si può prendere solo l'errore e la sua registrazione.

Se si desidera che gli utenti informano sull'errore, quindi chiudere la transazione o fare l'earlierer Flush (come indicato nei commenti di Paco e CBP). Un posto è di gestire la cosa nel vostro metodo di azione. Controllare il risultato e segnalarlo all'utente con una pagina di errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top