IndexOutOfRangeException Глубоко в кишечнике NHibernate

У меня есть следующие отображения:

public class SecurityMap : ClassMap<Security>
    {
        public SecurityMap()
        {
            Table("Security");
            CompositeId().KeyProperty(k => k.Id, "SecurityId").KeyProperty(k => k.EndDate);
            Map(x => x.LastUpdateUser);
            References(x => x.Company).Columns("CompanyId", "EndDate");
            References(x => x.PrimaryListing).Columns("PrimaryListingId", "EndDate");
         }
    }

public class ListingMap : ClassMap<Listing>
    {
        public ListingMap()
        {
            Table("Listing");
            CompositeId().KeyProperty(k => k.Id, "ListingID").KeyProperty(k => k.EndDate);
            References(x => x.Security).Columns("SecurityId","EndDate");
        }
    }

 public class CompanyMap : ClassMap<Company>
    {
        public CompanyMap()
        {
            Table("Company");
            CompositeId().KeyProperty(k => k.Id, "CompanyID").KeyProperty(k => k.EndDate);
            HasMany(x => x.Securities).KeyColumns.Add("CompanyId", "EndDate");
        }       
    }

Когда я пытаюсь запустить этот тест:

[Test]
public void can_update_a_security()
{
    var repo = IoC.Resolve<ISecurityRepository>();
    int someSecurity = 1;
    using (var work = IoC.Resolve<IUnitOfWorkManager>().Current)
    {
        Security security = repo.Get(someSecurity);
        security.ShouldNotBeNull();
        security.LastUpdateUser = "Dirk Diggler" + DateTime.Now.Ticks;
        repo.Save(security);
        work.Commit();
    }
}

Я получаю следующую ошибку глубоко в кишечнике NHibernate:

Выполните Систему. IndexOutOfRangeException: Недопустимый индекс 6 для этого SqlParameterCollection с Count=6. в System. Данные. SqlClient. SqlParameterCollection. RangeCheck (индекс Int32) в System. Данные. SqlClient. SqlParameterCollection. GetParameter (индекс Int32) в System. Данные. Распространенный. DbParameterCollection. Система. Наборы. IList.get_Item (индекс Int32) s:\NHibernate\NHibernate\src\NHibernate\Type\DateTimeType.cs(65, 0): в NHibernate. Ввести. DateTimeType. Набор (IDbCommand st, Объектное значение, индекс Int32) s:\NHibernate\NHibernate\src\NHibernate\Type\NullableType.cs(180, 0): в NHibernate. Ввести. NullableType. NullSafeSet (IDbCommand cmd, Объектное значение, индекс Int32) s:\NHibernate\NHibernate\src\NHibernate\Type\NullableType.cs(139, 0): в NHibernate. Ввести. NullableType. NullSafeSet (IDbCommand st, Объектное значение, индекс Int32, сессия ISessionImplementor) s:\NHibernate\NHibernate\src\NHibernate\Type\ComponentType.cs(213, 0): в NHibernate. Ввести. ComponentType. NullSafeSet (IDbCommand st, Объектное значение, Int32 начинаются, сессия ISessionImplementor), s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2393, 0): в NHibernate. Стойкий организм. Объект. AbstractEntityPersister. Обезводьте (Идентификатор объекта, поля Object [], Объект rowId, булевская переменная [] includeProperty, булевская переменная [] [] includeColumns, таблица Int32, оператор IDbCommand, сессия ISessionImplementor, индекс Int32) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2754, 0): в NHibernate. Стойкий организм. Объект. AbstractEntityPersister. Обновление (Идентификатор объекта, поля Object [], Объект [] oldFields, Объект rowId, булевская переменная [] includeProperty, Int32 j, Объект oldVersion, Объект obj, SqlCommandInfo sql, сессия ISessionImplementor) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2666, 0): в NHibernate. Стойкий организм. Объект. AbstractEntityPersister. UpdateOrInsert (Идентификатор объекта, поля Object [], Объект [] oldFields, Объект rowId, булевская переменная [] includeProperty, Int32 j, Объект oldVersion, Объект obj, SqlCommandInfo sql, сессия ISessionImplementor) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2940, 0): в NHibernate. Стойкий организм. Объект. AbstractEntityPersister. Обновление (Идентификатор объекта, поля Object [], Int32 [] dirtyFields, булевская переменная hasDirtyCollection, Объект [] oldFields, Объект oldVersion, Объект obj, Объект rowId, сессия ISessionImplementor) s:\NHibernate\NHibernate\src\NHibernate\Action\EntityUpdateAction.cs(78, 0): в NHibernate. Действие. EntityUpdateAction. Выполнитесь () s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(130, 0): в NHibernate. Механизм. ActionQueue. Выполнитесь (исполняемый файл IExecutable) s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(113, 0): в NHibernate. Механизм. ActionQueue. ExecuteActions (список IList) s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(147, 0): в NHibernate. Механизм. ActionQueue. ExecuteActions () s:\NHibernate\NHibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs(241, 0): в NHibernate. Событие. Значение по умолчанию. AbstractFlushingEventListener. PerformExecutions (сессия IEventSource) s:\NHibernate\NHibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs(19, 0): в NHibernate. Событие. Значение по умолчанию. DefaultFlushEventListener. OnFlush (событие FlushEvent) s:\NHibernate\NHibernate\src\NHibernate\Impl\SessionImpl.cs(1478, 0): в NHibernate. Impl. SessionImpl. Сброс () s:\NHibernate\NHibernate\src\NHibernate\Transaction\AdoTransaction.cs(187, 0): в NHibernate. Транзакция. AdoTransaction. Фиксация () в lambda_method (ExecutionScope, ITransaction)

Теперь интересная вещь состоит в том, если я комментирую ссылку на Компанию или PrimaryListing в SecurityMap, я не получаю ошибку. Это, кажется, не имеет значения, который я комментирую. Ошибка только происходит, когда у меня есть оба.

То, когда обновление на самом деле проходит NHProf, показывает мне это обновление:

UPDATE Security
SET    LastUpdateUser = '2010-02-19T08:09:24.00' /* @p0 */,
       CompanyId = 54199 /* @p1 */,
       EndDate = '9999-12-31T00:00:00.00' /* @p2 */
WHERE  SecurityId = 1 /* @p3 */
       AND EndDate = '9999-12-31T00:00:00.00' /* @p4 */

Я не уверен, почему это обновляет CompanyId и EndDate, но я подозреваю, что это связано.

У кого-либо есть идеи? Работа arounds значительно ценилась бы.

12
задан Jaguar 16 September 2010 в 10:32
поделиться

1 ответ

Да, это обычная проблема, вы дважды используете столбец «EndDate» в определении сопоставления (как для компании, так и для первичного списка), и это недопустимо. Один из них должен уйти или иметь дополнительный столбец EndDate (по одному для каждой ассоциации)

тоже проверьте это nHibernate 2.0 - сопоставление составного идентификатора * и * отношения многие-к-одному вызывает ошибку «неверный индекс»

и http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for- this-sqlparametercollection-with-count-n-error.aspx

30
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: