poniedziałek, 29 marca 2010

KeyNotFoundException w NHibernate

Podczas pisania mapowań dla NHibernate w moim projekcie, natknąłem się na dość problematyczny błąd. Na samym początku informacje zwrotne nic specjalnego nie mówiły, a przynajmniej nic co od razu nasuwało źródło problemu:

System.Collections.Generic.KeyNotFoundException: Dany klucz nie był obecny w słowniku.
...

W śladzie stosu nie było też dużo lepszych informacji o genezie błędu. Ale do tego każdy programista powinien się do pewnego stopnia przyzwyczaić ;)
Po dokładniejszej analizie okazało się, że chociaż parsowania plików mapować zakończono bezbłędnie to już zbudowanie fabryki sesji powodowało wyżej wymieniony błąd. A wszystkiemu zawinił następujący fragment:

<one-to-one name="Worker" class="Worker" cascade="all" />

Wygląda całkiem niewinnie, z tym, że mapowanie do klasy Worker znajduje się w innym assembly. I stąd cały problem. NHibernate założył istnienie mapowania, którego później nie mógł znaleźć. Rozwiązanie całej sytuacji wydaje się wręcz trywialne:
<one-to-one
    name="Worker" 
    class="Full.Namespace.To.Class.Worker,Assembly.With.Worker"
    cascade="all" />

Pozostaje jeszcze pytanie jak zapobiegać takim sytuacjom w przyszłości? Można nie zrobić nic i przeklinać własną sklerozę, albo zrezygnować z mapowań xml i przerzucić się na Fluent NHibernate gdzie o taki błąd będzie trudniej (w związku z kompilowaną charakterystyką rozwiązania).

3 komentarze: