2010-03-10 3 views
6

Ich versuche, eine Eltern-Kind-Beziehung zwischen einer Person Objekt abzubilden und eine Objekt-Organisation in FluentNHibernate Referenzen in der Mapping-Datei wie folgt verwendet:FluentNHibernate Mapping Referenzen Index außerhalb des Bereichs verwendet Wenn neues Objekt Hinzufügen

Referenzen (x => x.Organisation);

Die Beziehung ist ein Person-Objekt, das eine OrganizationId-Spalte enthält, die einem Datensatz in der Organization-Tabelle mit der entsprechenden OrganizationId entspricht. Verschiedene Personendatensätze können derselben Organisation angehören.

Wenn ich ein Person-Objekt abrufen, funktioniert es ordnungsgemäß. Person.Organisation ist ausgefüllt. Ich kann ein Person-Objekt speichern und es funktioniert ordnungsgemäß. Wenn ich jedoch versuche, ein neues Person-Objekt hinzuzufügen, erhalte ich eine Index-außerhalb-des-Bereichs-Ausnahme von NHibernate. Die Ausnahme tritt beim Aufrufen von session.SaveOrUpdate (Person) auf. Ich habe versucht, die Zuordnung zu ändern:

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

immer noch die gleichen Fehler. Ich kann nicht herausfinden, was die Ausnahme verursacht. Die vollständige Ausnahme ist dies:

System.IndexOutOfRangeException: Invalid Index 22 für diese SqlParameterCollection mit Count = 22. bei System.Data.SqlClient.SqlParameterCollection.RangeCheck (Int32-Index) bei System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32-Index) bei System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Int32-Index) bei NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Objektwert, Int32 Index) bei NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, Objektwert, Int32 Index, Boolean [] einstellbar, ISessionImplementor Sitzung) bei NHibernate .Persister.Entity.AbstractEntityPersister.Dehydrate (Objekt-ID, Object [] - Felder, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, Int32-Tabelle, IDbCommand-Anweisung, ISessionImplementor-Sitzung, Int32-Index) bei NHibernate.Persister. Entity.AbstractEntityPersister.GeneratedIdentifierBin der.BindValues ​​(IDbCommand ps) bei NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo InsertSQL ISessionImplementor Sitzung, IBinder Bindemittel) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] Felder, Boolean [] NotNull, SqlCommandInfo sql, Object obj, ISessionImplementor Sitzung) bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] Felder, Objekt obj, ISessionImplementor Sitzung) bei NHibernate.Action.EntityIdentityInsertAction.Execute() bei NHibernate.Engine.ActionQueue .Execute (IExecutable ausführbare Datei) bei NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (Objektinstanz, EntityKey-Schlüssel, IEntityPersister-Persister, Boolean useIdentityColumn, Alles Object, IEventSource-Quelle, Boolean requiresImmediateIdAccess) bei NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (Object Entität, String entityName, Object alles, IEventSource Quelle, Boolean requiresImmediateIdAccess) bei NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId (SaveOrUpdateEvent Ereignis) bei NHibernate.Event.Default. DefaultSaveOrUpdateEventListener.EntityIsTransient (SaveOrUpdateEvent Ereignis) bei NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (SaveOrUpdateEvent Ereignis) bei NHibernate.Impl.SessionImpl.FireSaveOrUpdate (SaveOrUpdateEvent Ereignis) bei NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj)

+0

Ich kann nicht herausfinden, was die Ausnahme verursacht, weil Sie den Code nicht gepostet haben, der die Ausnahme verursacht. (Entity/Mapping-Klassen) – Paco

+0

Ich habe nur ein wenig Text zu der Frage hinzugefügt. Es tritt auf, wenn session.SaveOrUpdate (person) aufgerufen wird, wenn das Personenobjekt eine neue Person ist, die nicht in der Datenbank vorhanden ist. – Jeff

+0

Wurde die Elternorganisation zuvor eingefügt? – mxmissile

Antwort

7

Zuerst tritt die Ausnahme auf, weil Sie die gleiche Spalte zuordnen zweimal in deiner Klasse und das ist nicht erlaubt. überprüfen Sie diesen IndexOutOfRangeException Deep in the bowels of NHibernate

Zweitens (und nach Ihrem neuesten Kommentar) eine OrganizationId und eine Organisation Eigenschaft in Ihrer Klasse Person, die ist sorten von gegen den Strich gehen. Du brauchst es nicht. Sie können darauf zugreifen über per1.Organization.Id

Wenn Sie bereits eine Organisation in Ihrem db haben (sagen Id = 5) und Sie die Organisation Klasse in die Klasse Person Karte die OrganizationId Fremdschlüssel verwenden, dann, wenn Sie Code

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

NHibernate wird nur den Wert 5 für die Spalte OrganizationId in Ihrer Personentabelle festlegen. Sie werden die Organisation nicht füllen.

Verwandte Themen