ArgumentOutOfRangeException: индекс был вне диапазона - PullRequest
5 голосов
/ 01 марта 2009

Я получаю это странное ArgumentOutOfRangeException всякий раз, когда я использую Класс PersitenceSpecification для проверки объекта, который имеет ссылка на объект значения.

    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)
        {}
    }

Вот ошибка, которую я получаю:

TestCase «Then_a_catalog_object_should_be_persistable» не выполняется: System.ArgumentOutOfRangeException: Индекс был вне диапазона. Должно быть неотрицательный и меньше размера Коллекция. Имя параметра: индекс в System.ThrowHelper.ThrowArgumentOutOfRangeException (Аргумент ExceptionArgument, Ресурс ExceptionResource) в System.ThrowHelper.ThrowArgumentOutOfRangeException () в 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 (Свойство объектаValue) d: \ Строит \ FluentNH \ SRC \ FluentNHibernate \ Тестирование \ PersistenceSpecification.cs (105,0): в FluentNHibernate.Testing.PersistenceSpecification`1.VerifyTheMappings () C: \ Source \ SupplyChain \ Тесты \ Retailer.IntegrationTests \ Отображение \ CatalogItemMappingSpecifications.cs (14,0): в SupplyChain.Retailer.IntegrationTests.Mappings.When_verifying_the_class_mapping_of_a_catalog_item.Then_a_catalog_object_should_be_persistable ()

Извините за длинный пост, но этот занял меня на пару часов сейчас. Это может быть вызвано не FNH, так как я нашел этот билет JIRA самого NH, который упоминает нечто подобное:

http://forum.hibernate.org/viewtopic.php?p=2395409

Я все еще надеюсь, что я делаю что-то не так в моем коде :-). любой думали?

Заранее спасибо

Ответы [ 6 ]

15 голосов
/ 07 марта 2009

Я нашел решение этой проблемы, которое возникло из моих собственных глупость в первую очередь. Мне все стало ясно, как только я сгенерировал файлы hbm из беглого отображения NH.

<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>

Обратите внимание, что столбец для свойства Name и столбец для Компонент производителя отображается в один и тот же столбец. Вот почему это привело к ArgumentOutOfRangeException, потому что было больше аргументов, чем было имен столбцов. Я решил это точное указание имени столбца для сопоставления компонента:

Компонент (catalogItem => catalogItem.Manufacturer, m => m.Map (производитель => имя производителя, "Производитель"));

Еще один урок.

2 голосов
/ 29 сентября 2012

В моем случае я сопоставлял два свойства одному столбцу с помощью Fluent NHibernate.

0 голосов
/ 23 мая 2014

Старый вопрос, но если кто-то сталкивается с той же проблемой, что и я, может быть полезно знать, что эта проблема Fluent Nhibernate (ColumnPrefix применяется только к первому сопоставлению компонентов внутри ComponentMap) может дать то же самое исключение, поскольку префиксы столбцов не всегда применяются.

0 голосов
/ 22 августа 2010

В моем конкретном случае я добавлял свойство и идентификатор (используя атрибуты) к тому же свойству .NET. Это привело к той же ошибке.

0 голосов
/ 02 марта 2009

Да, я удалил этот, чтобы уменьшить шум. Я думаю, я забыл удалить его из сопоставления, а также. Проведя еще несколько исследований, я заметил, что это как-то связано с отображением производителя в качестве компонента. Когда я использовал простую старую строку вместо отдельного класса, все работало нормально.

0 голосов
/ 01 марта 2009

У вашего CatalogItem нет свойства Price, что кажется странным, когда вы используете помощник Reveal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...