gpt4 book ai didi

nhibernate - IndexOutOfRangeException 深入 NHibernate

转载 作者:行者123 更新时间:2023-12-04 00:09:22 26 4
gpt4 key购买 nike

我有以下映射:

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 的内部深处收到以下错误:

Execute System.IndexOutOfRangeException: Invalid index 6 for this SqlParameterCollection with Count=6. at System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32 index) at System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32 index) at System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index) s:\NHibernate\NHibernate\src\NHibernate\Type\DateTimeType.cs(65,0): at NHibernate.Type.DateTimeType.Set(IDbCommand st, Object value, Int32 index) s:\NHibernate\NHibernate\src\NHibernate\Type\NullableType.cs(180,0): at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) s:\NHibernate\NHibernate\src\NHibernate\Type\NullableType.cs(139,0): at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) s:\NHibernate\NHibernate\src\NHibernate\Type\ComponentType.cs(213,0): at NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2393,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2754,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2666,0): at NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert(Object id, Object[] fields, Object[] oldFields, Object rowId, Boolean[] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s:\NHibernate\NHibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs(2940,0): at NHibernate.Persister.Entity.AbstractEntityPersister.Update(Object id, Object[] fields, Int32[] dirtyFields, Boolean hasDirtyCollection, Object[] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) s:\NHibernate\NHibernate\src\NHibernate\Action\EntityUpdateAction.cs(78,0): at NHibernate.Action.EntityUpdateAction.Execute() s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(130,0): at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(113,0): at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) s:\NHibernate\NHibernate\src\NHibernate\Engine\ActionQueue.cs(147,0): at NHibernate.Engine.ActionQueue.ExecuteActions() s:\NHibernate\NHibernate\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs(241,0): at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session) s:\NHibernate\NHibernate\src\NHibernate\Event\Default\DefaultFlushEventListener.cs(19,0): at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) s:\NHibernate\NHibernate\src\NHibernate\Impl\SessionImpl.cs(1478,0): at NHibernate.Impl.SessionImpl.Flush() s:\NHibernate\NHibernate\src\NHibernate\Transaction\AdoTransaction.cs(187,0): at NHibernate.Transaction.AdoTransaction.Commit() at lambda_method(ExecutionScope , ITransaction )



现在有趣的是,如果我在 SecurityMap 中注释掉对 Company 或 PrimaryListing 的引用,我不会收到错误消息。我注释掉哪个似乎无关紧要。只有当我同时拥有两者时才会发生错误。

当更新实际通过 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,但我怀疑它是相关的。

有人有想法吗?解决方法将不胜感激。

最佳答案

是的,这是一个常见问题,您正在使用 Column "EndDate"在您的映射定义中出现两次(对于 Company 和 PrimaryListing),这是不允许的。其中一个必须去,或者有一个额外的 EndDate 列(每个关联一个)

也检查这个
nHibernate 2.0 - mapping a composite-id *and* many-to-one relationship causes "invalid index" error


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

关于nhibernate - IndexOutOfRangeException 深入 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2298026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com