Good catch!

On Fri, Mar 6, 2009 at 9:26 PM, Jan Van Ryswyck
<jan.van.rysw...@gmail.com>wrote:

>
> I found the solution to this problem which resulted from my own
> stupidity in the first place. It all became clear to me as soon as I
> generated the hbm files from the fluent NH mapping.
>
> <class name="CatalogItem" table="`CatalogItem`" xmlns="urn:nhibernate-
> mapping-2.2" optimistic-lock="version">
>    ...
>
>    <property name="Name" length="100" type="String">
>      <column name="Name" />
>    </property>
>
>    ...
>
>    <component name="Manufacturer" insert="false" update="true">
>      <property name="Name" length="100" type="String">
>        <column name="Name" />
>      </property>
>    </component>
>  </class>
>
> Notice that the column for the Name property and the column for the
> Manufacturer component are both mapped to the same column. That's why
> this resulted into an ArgumentOutOfRangeException, because there were
> more arguments than there were column names. I solved this by
> explicitely specifying a column name for the component mapping:
>
> Component(catalogItem => catalogItem.Manufacturer,
>                      m => m.Map(manufacturer => manufacturer.Name,
> "Manufacturer"));
>
> Another lesson learned.
>
> On 28 feb, 01:04, Jan Van Ryswyck <jan.van.rysw...@gmail.com> wrote:
> > Hi,
> >
> > I'm getting this weirdArgumentOutOfRangeExceptionwhenever I use the
> > PersitenceSpecification class for verifying an entity that has a
> > reference to a value object.
> >
> >     public class CatalogItem : DomainEntity
> >     {
> >         internal virtual Manufacturer Manufacturer { get; private
> > set; }
> >         internal virtual String Name { get; private set; }
> >
> >         protected CatalogItem()
> >         {}
> >
> >         public CatalogItem(String name, String manufacturer)
> >         {
> >             Name = name;
> >             Manufacturer = new Manufacturer(manufacturer);
> >         }
> >     }
> >
> >     public class CatalogItemMapping : ClassMap<CatalogItem>
> >     {
> >         public CatalogItemMapping()
> >         {
> >             Id(catalogItem => catalogItem.Id);
> >
> >             Component<Manufacturer>(category => category.Manufacturer,
> >                                     m => m.Map(manufacturer =>
> > manufacturer.Name));
> >
> >             Map(catalogItem => catalogItem.Name);
> >             Map(Reveal.Property<CatalogItem>("Price"));
> >         }
> >     }
> >
> >     [TestFixture]
> >     public class When_verifying_the_class_mapping_of_a_catalog_item
> >         : NHibernateSpecification
> >     {
> >         [Test]
> >         public void Then_a_catalog_object_should_be_persistable()
> >         {
> >             new PersistenceSpecification<CatalogItem>(Session)
> >                 .VerifyTheMappings();
> >         }
> >     }
> >
> >     [TestFixture]
> >     public class NHibernateSpecification
> >         : Specification
> >     {
> >         protected ISession Session { get; private set; }
> >
> >         protected override void Establish_context()
> >         {
> >             var configuration = new SQLiteConfiguration()
> >                 .InMemory()
> >                 .ShowSql()
> >                 .ToProperties();
> >
> >             var sessionSource = new SessionSource(configuration, new
> > RetailerPersistenceModel());
> >             Session = sessionSource.CreateSession();
> >
> >             sessionSource.BuildSchema(Session);
> >             ProvideInitialData(Session);
> >
> >             Session.Flush();
> >             Session.Clear();
> >         }
> >
> >         protected override void Dispose_context()
> >         {
> >             Session.Dispose();
> >             Session = null;
> >         }
> >
> >         protected virtual void ProvideInitialData(ISession session)
> >         {}
> >     }
> >
> > Here's the error I'm getting:
> >
> > TestCase 'Then_a_catalog_object_should_be_persistable'
> > not executed: System.ArgumentOutOfRangeException: Index was out of
> > range. Must be non-negative and less than the size of the collection.
> > Parameter name: index
> >         at System.ThrowHelper.ThrowArgumentOutOfRangeException
> > (ExceptionArgument argument, ExceptionResource resource)
> >         at System.ThrowHelper.ThrowArgumentOutOfRangeException()
> >         at System.Collections.Generic.List`1.get_Item(Int32 index)
> >         at
> System.Data.SQLite.SQLiteParameterCollection.GetParameter(Int32
> > index)
> >         at
> >
> System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item
> > (Int32 index)
> >         at NHibernate.Type.GuidType.Set(IDbCommand cmd, Object value,
> Int32
> > index)
> >         at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd,
> Object
> > value, Int32 index)
> >         at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object
> > value, Int32 index, ISessionImplementor session)
> >         at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate
> > (Object id, Object[] fields, Object rowId, Boolean[] includeProperty,
> > Boolean[][] includeColumns, Int32 table, IDbCommand statement,
> > ISessionImplementor session, Int32 index)
> >         at
> NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object
> > id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql,
> > Object obj, ISessionImplementor session)
> >         at
> NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object
> > id, Object[] fields, Object obj, ISessionImplementor session)
> >         at NHibernate.Action.EntityInsertAction.Execute()
> >         at NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
> >         at NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
> >         at NHibernate.Engine.ActionQueue.ExecuteActions()
> >         at
> > NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions
> > (IEventSource session)
> >         at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush
> > (FlushEvent event)
> >         at NHibernate.Impl.SessionImpl.Flush()
> >         at NHibernate.Transaction.AdoTransaction.Commit()
> >         d:\Builds\FluentNH\src\FluentNHibernate\Testing
> > \PersistenceSpecification.cs(127,0): at
> > FluentNHibernate.Testing.PersistenceSpecification`1.TransactionalSave
> > (Object propertyValue)
> >         d:\Builds\FluentNH\src\FluentNHibernate\Testing
> > \PersistenceSpecification.cs(105,0): at
> > FluentNHibernate.Testing.PersistenceSpecification`1.VerifyTheMappings
> > ()
> >         C:\Source\SupplyChain\Tests\Retailer.IntegrationTests\Mappings
> > \CatalogItemMappingSpecifications.cs(14,0): at
> >
> SupplyChain.Retailer.IntegrationTests.Mappings.When_verifying_the_class_mapping_of_a_catalog_item.Then_a_catalog_object_should_be_persistable
> > ()
> >
> > Sorry for the long post, but this one got me busy for a couple of
> > hours now. This might not be caused by FNH as I found this JIRA ticket
> > of NH itself that mentions something similar:
> >
> > http://forum.hibernate.org/viewtopic.php?p=2395409
> >
> > I'm still hoping that I'm doing something wrong in my code :-). Any
> > thought?
> >
> > Thanks in advance
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To post to this group, send email to fluent-nhibernate@googlegroups.com
To unsubscribe from this group, send email to 
fluent-nhibernate+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to