Not*_*elf 12 mapping nhibernate exception nhibernate-mapping fluent-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");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此测试时:
[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();
}
}
Run Code Online (Sandbox Code Playgroud)
我在NHibernate的内容深处得到以下错误:
执行System.IndexOutOfRangeException:此SqlParameterCollection的索引6无效,Count = 6.在System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32索引)的System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32索引)处于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):在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,对象的值,的Int32开始,ISessionImplementor会话)S:\ NHibernate的\ NHibernate的的\ src\NHibernate的\留存\实体\ 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 \留存\实体\ AbstractEntityPersister.cs(2 940,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):在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):在NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource会话)S:\ NHibernate的\ NHibernate的\ SRC\NHibernate的\事件\默认\ 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):在lambda_method的NHibernate.Transaction.AdoTransaction.Commit()(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 */
Run Code Online (Sandbox Code Playgroud)
我不确定为什么它会更新CompanyId和EndDate,但我怀疑它是相关的.
有谁有想法?非常感谢周围的工作.
Jag*_*uar 30
是的,这是一个常见问题,您Column "EndDate"在映射定义中使用了两次(对于Company和PrimaryListing)并且不允许这样做.其中一个必须去,或者有一个额外的EndDate列(每个关联一个)
检查这个 nHibernate 2.0 - 映射复合id*和*多对一关系会导致"无效索引"错误
| 归档时间: |
|
| 查看次数: |
8212 次 |
| 最近记录: |