2010-03-10 13 views
6

usiłuję mapować relacji nadrzędny podrzędny między obiektu osoba i obiektu organizacja FluentNhibernate pomocą odwołań w pliku odwzorowania tak:FluentNhibernate Mapowanie Korzystanie Referencje Index Out of Range podczas dodawania nowego obiektu

Odniesienia (x => x.Organizacja);

Relacja jest obiektem Person zawiera kolumnę OrganizationId, która odpowiada rekordowi w tabeli Organization z odpowiednim ID OrganizationId. Różne rekordy osób mogą należeć do tej samej organizacji.

Po pobraniu obiektu Person działa poprawnie. Person.Organizacja jest wypełniona. Mogę zapisać obiekt Person i działa on poprawnie. Jednak przy próbie dodania nowego obiektu Person otrzymuję wyjątek Index Out of Range od NHibernate. Wyjątek występuje podczas wywoływania session.SaveOrUpdate (osoba). Próbowałem zmienić mapowanie do:

Odniesienia (x => x.Organization) .Cascade.None()

wciąż ten sam błąd. Nie wiem, co powoduje wyjątek. Pełny wyjątek jest następujący:

System.IndexOutOfRangeException: Niepoprawny indeks 22 dla tego SqlParameterCollection z Count = 22. w System.Data.SqlClient.SqlParameterCollection.RangeCheck (indeks Int32) w System.Data.SqlClient.SqlParameterCollection.GetParameter (indeks Int32) w System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Indeks Int32) w NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd wartość obiektu, indeks Int32) w NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, wartość obiektu, indeks Int32, logiczna [] ustawiane, ISessionImplementor sesji) w NHibernate .Persister.Entity.AbstractEntityPersister.Dehydrate (identyfikator obiektu, pola Object [], Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabela Int32, instrukcja IDbCommand, sesja ISessionImplementor, indeks Int32) w NHibernate.Persister. Entity.AbstractEntityPersister.GeneratedIdentifierBin der.BindValues ​​(IDbCommand ps) w NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, sesja ISessionImplementor, segregator IBinder) w NHibernate.Persister.Entity.AbstractEntityPersister.Insert (pola Object [], Boolean [] notNull, SqlCommandInfo SQL Object obj sesja ISessionImplementor) w NHibernate.Persister.Entity.AbstractEntityPersister.Insert ([] obszary, obj Przedmiot session Object) ISessionImplementor w NHibernate.Action.EntityIdentityInsertAction.Execute() w NHibernate.Engine.ActionQueue .Execute (IExecutable executable) w NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (Obiekt obiektu, klucz EntityKey, IEntityPersister persister, Boolean useIdentityColumn, Object anything, źródło IEventSource, Boolean requiresImmediateIdAccess) na NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (podmiot Object, String entityName, obiekt czegokolwiek, źródło IEventSource, Boolean requiresImmediateIdAccess) w NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId (zdarzenie SaveOrUpdateEvent) na NHibernate.Event.Default. DefaultSaveOrUpdateEventListener.EntityIsTransient (zdarzenie SaveOrUpdateEvent) w NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (zdarzenie SaveOrUpdateEvent) w NHibernate.Impl.SessionImpl.FireSaveOrUpdate (zdarzenie SaveOrUpdateEvent) w NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj)

+0

Nie mogę ustalić przyczyny wyjątku, ponieważ nie wysłano kodu powodującego wyjątek. (klasy encji/mapowania) – Paco

+0

Właśnie dodałem trochę tekstu do pytania. Występuje podczas wywoływania session.SaveOrUpdate (osoba) , gdy obiekt osoby jest nową osobą, która nie istnieje w bazie danych. – Jeff

+0

Czy wcześniej wstawiono jednostkę nadrzędną? – mxmissile

Odpowiedz

7

Przede wszystkim występuje wyjątek, ponieważ mapujesz tę samą kolumnę umn dwa razy w twojej klasie, a to nie jest dozwolone. sprawdzić ten IndexOutOfRangeException Deep in the bowels of NHibernate

Po drugie (i według swojej najnowszej komentarzu) mającą OrganizationId i właściwość organizacją w swojej klasie osoba jest sort-iść pod prąd. Nie potrzebujesz tego. Można uzyskać do niego dostęp za pośrednictwem per1.Organization.Id

Jeśli masz już organizacją w db (powiedzmy id = 5) i zmapować klasę organizację do klasy osoba korzystająca z klucza obcego OrganizationId, a następnie, gdy kod

Organization theOrganizationWithId5 = nhSession.Get<Organization>(5); 
per1.Organization = theOrganizationWithId5; 
nhSession.Save(per1); 

NHibernate po prostu ustawi wartość 5 w kolumnie OrganizationId w twojej tabeli Person. Nie będziesz wypełniać organizacji.

Powiązane problemy