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 я получаю следующую ошибку:

Выполните System.IndexOutOfRangeException: недопустимый индекс 6 для этой коллекции SqlParameterCollection со счетчиком = 6. в System.Data.SqlClient.SqlParameterCollection.RangeCheck (индекс Int32) в System.Data.SqlClient.SqlParameterCollection.GetParameter (индекс Int32) в System.Data.Common.DbParameterCollection.System.Collections.IList.32_Site \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ DateTimeType.cs (65,0): в NHibernate.Type.DateTimeType.Set (IDbCommand st, значение объекта, индекс Int32) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ NullableType.cs (180,0): в NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, значение объекта, индекс Int32) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ NullableType.cs (139,0): в NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, значение объекта, индекс Int32, сеанс ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ ComponentType.cs (213,0): в NHibernate.Type.ComponentType. NullSafeSet (IDbCommand st, значение объекта, начало Int32, сеанс ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2393,0) : at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Идентификатор объекта, поля Object [], Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, таблица Int32, инструкция IDbCommand, сеанс ISessionImplementor, индекс Int32) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2754,0): в NHibernate.Persister.Entity.AbstractEntityPersister.Update (идентификатор объекта, поля объекта [], объект [] oldFields, объект rowId, логический [ ] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, сеанс ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2666,0): в NHibernate.Persister.Entity.Abstract .UpdateOrInsert (Идентификатор объекта, поля Object [], Object [] oldFields, Object rowId, Boolean [] includeProperty, Int32 j, Объект oldVersion, Object obj, SqlCommandInfo sql, сеанс ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ стойкая бактерия \ Entity \ AbstractEntityPersister.cs (2 940,0): в NHibernate.Persister.Entity.AbstractEntityPersister.Update (идентификатор объекта, поля Object [], Int32 [] dirtyFields, логическое значение hasDirtyCollection, Object [] oldFields, объект oldVersion, объект obj, объект rowId, сеанс ISessionImplementor). : \ NHibernate \ NHibernate \ src \ NHibernate \ Action \ EntityUpdateAction.cs (78,0): в NHibernate.Action.EntityUpdateAction.Execute () s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (130, 0): в NHibernate.Engine.ActionQueue.Execute (исполняемый файл IExecutable) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (113,0): в NHibernate.Engine.ActionQueue.ExecuteActions (список IList) : \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (147,0): в NHibernate.Engine.ActionQueue.ExecuteActions () s: \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ AbstractFlushingEventListener.cs ( 241,0): в NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (сеанс IEventSource) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ D efaultFlushEventListener.cs (19,0): в NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (событие FlushEvent) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs (1478,0): в NHibernate.Impl. SessionImpl.Flush () s: \ NHibernate \ NHibernate \ src \ NHibernate \ Transaction \ AdoTransaction.cs (187,0): в NHibernate.Transaction.AdoTransaction.Commit () в lambda_method (ExecutionScope, ITransaction)

Теперь интересно, если я закомментирую ссылку на Company или 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, но я подозреваю, что это связано.

У кого-нибудь есть идеи? Работа вокруг будет принята с благодарностью.

Ответы на вопрос(1)

Ваш ответ на вопрос