У меня есть следующие отображения:
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 значительно ценилась бы.
Да, это обычная проблема, вы дважды используете столбец «EndDate»
в определении сопоставления (как для компании, так и для первичного списка), и это недопустимо. Один из них должен уйти или иметь дополнительный столбец EndDate (по одному для каждой ассоциации)
тоже проверьте это nHibernate 2.0 - сопоставление составного идентификатора * и * отношения многие-к-одному вызывает ошибку «неверный индекс»