2009-04-14 22 views
8

byłem spotykając się następujący błąd, gdy próbuje zbudować fabrykę sesji:Obscure błąd NHibernate/Fluent NHibernate

PersistenceTests.Can_Map_Orders_To_Database : Failed 
System.IndexOutOfRangeException: Index was outside the bounds of the 
array. 
at NHibernate.Mapping.Column.set_Name(String value) 
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindColumns(XmlNode node, 
SimpleValue model, Boolean isNullable, Boolean autoColumn, String 
propertyPath) 
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindColumnsOrFormula 
(XmlNode node, SimpleValue simpleValue, String path, Boolean 
isNullable) 
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindSimpleValue(XmlNode 
node, SimpleValue model, Boolean isNullable, String path) 
at 
NHibernate.Cfg.XmlHbmBinding.CollectionBinder.BindCollectionSecondPass 
(XmlNode node, Collection model, IDictionary`2 persistentClasses) 
at 
NHibernate.Cfg.XmlHbmBinding.CollectionBinder.<>c__DisplayClassd.<AddCollec tionSecondPass>b__c 
(IDictionary`2 persistentClasses) 
at NHibernate.Cfg.Configuration.SecondPassCompile() 
at NHibernate.Cfg.Configuration.BuildSessionFactory() 
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in c: 
\Code Samples\NHibernate\Fluent Nhibernate - Trunk\src\FluentNHibernate 
\Cfg\FluentConfiguration.cs: line 94 
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or 
incomplete configuration was used while creating a SessionFactory. 
Check PotentialReasons collection, and InnerException for more detail. 
at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in c: 
\Code Samples\NHibernate\Fluent Nhibernate - Trunk\src\FluentNHibernate 
\Cfg\FluentConfiguration.cs: line 99 
at FluentNHibernate.SessionSource..ctor(FluentConfiguration config) in 
c:\Code Samples\NHibernate\Fluent Nhibernate - Trunk\src 
\FluentNHibernate\SessionSource.cs: line 38 
at 
FluentNHibernate.Testing.SingleConnectionSessionSourceForSQLiteInMemoryTest ing..ctor 
(FluentConfiguration config) in c:\Code Samples\NHibernate\Fluent 
Nhibernate - Trunk\src\FluentNHibernate\Testing 
\SingleConnectionSessionSourceForSQLiteInMemoryTesting.cs: line 15 
at Core.Infrastructure.Data.NHibernate.Tests.PersistenceTests.SetUp() 
in PersistenceTests.cs: line 26 

pracuję na pniu FNH i NH 2.0.1. Zabawne jest to, że mogę w stanie skompilować moje mapowania (przez AutoPersistenceModel.CompileMappings) i zapisać je do systemu plików z powodzeniem - FNH nie narzeka. To tylko przy próbie zbudowania fabryki sesji, że wszystko idzie kaboom z niezbyt przydatnym komunikatem błędu powyżej. Ktoś ma jakieś pomysły?

+0

Konfiguracja jest ...? – Paco

Odpowiedz

6

Fluent NHibernate sama rzadko narzeka na siebie bezpośrednio. Wewnętrznie po prostu budujesz swoje pliki HBM, więc jeśli powiesz, że coś złego zbudujesz, to właściwy NHibernate będzie złym humorem.

Jeśli nie masz już, może chcesz zacząć eksportowanie plików odwzorowań tak:

.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MyClass>() 
    .ExportTo("path") 

Następnie można grzebać tam, aby zobaczyć, czy coś jest nie tak. Pamiętam, jak już raz dostałem ten błąd i myślę, że dotyczy on niedopasowania liczby zmapowanych kolumn. To był jeden z tych łatwych do przegapenia błędów w moim mapowaniu, więc niestety jedyne, co mogę zasugerować, to naprawdę przeszukać wyjście z ExportTo dla wszystkiego, co nie ma sensu.

+1

Po przejściu przez ponad 90 plików mapujących, wygląda na to, że FNH nie generował nazw kolumn dla niektórych relacji wiele-do-wielu i jeden-do-wielu, które określiłem w nadpisaniach mapowania (implementacje IAutoMappingOverride). Zazwyczaj tego rodzaju rzeczy są obsługiwane przez konwencje, ale tak nie było. – Jimit

+6

Dla każdego, kto napotkał ten problem, FNH wydaje się mapować obiekty używając najpierw automappera, następnie zdefiniowane przez użytkownika konwencje, następnie domyślne konwencje i wreszcie twoje nadpisania mapowania. Tak więc konwencje nie zostaną wykonane po wywołaniu twoich przesłonięć, a więc musisz być jednoznaczny. – Jimit

1

Będziemy potrzebować twojej konfiguracji, aby pomóc wiele. Ale ta część śladu stosu powinna dać ci pojęcie, od czego zacząć.

at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() in c: 
\Code Samples\NHibernate\Fluent Nhibernate - Trunk\src\FluentNHibernate 
\Cfg\FluentConfiguration.cs: line 94 
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or 
incomplete configuration was used while creating a SessionFactory. 
Check PotentialReasons collection, and InnerException for more detail. 
13

Znalazłem, że wewnętrzny wyjątek dał więcej szczegółów. W moim przypadku musiałem dodać plik NHibernate.ByteCode.Castle.dll do referencji.