Jak dostać się do InnerException w RIA Services

Dziś postanowiłem wyjaśnić problem, który zauważyłem jest często poruszany na forach. Załóżmy, że wywołujemy metodę SubmitChanges aby zatwierdzić wprowadzone modyfikacje. Wykonanie metody jednak nie powodzi się i wyrzucany jest wyjątek. Scenariusz wygląda typowo jednak często otrzymujemy mało mówiący komunikat typu:

Submit operation failed. Exception has been thrown by the target of an invocation.

lub

Submit operation failed. An error occurred while updating the entries. See the InnerException for details.

Co gorsza, jeśli zajrzymy do InnerException zobaczymy wartość NULL. Oczywiście mówimy ciągle o stronie klienta. Pytanie brzmi więc: W jaki sposób możemy podejrzeć co tak naprawdę stało się?

Rozwiązaniem jest przeładowanie metody Submit(DomainService) lub OnError(DomainService) oraz obsłużenie tam ewentualnych wyjątków:

public override bool Submit(ChangeSet changeSet)
{
  try
  {
      return base.Submit(changeSet);
  }
  catch (Exception e)
  {
      throw;
  }
}

Jeśli zajrzymy do InnerException zobaczymy, że wyjątek jest tam zapisany i możemy przeczytać dokładniejszą informację np.

Violation of PRIMARY KEY constraint 'PK_Table.Tests'. Cannot insert duplicate key in object 'TestModule.Tests'.
The statement has been terminated.

Rozwiązanie jest być może niezbyt eleganckie ale działa bez zarzutu.

Leave a Reply

Your email address will not be published.