2

I've defined a composite-id for my NHibernate database model. I've used one of the columns defined in a foreign key relationship too. If I insert an object using NHibernate, I get the following Exception:

System.IndexOutOfRangeException: Invalid index 7 for this SqlParameterCollection with Count=7.
at System.Data.SqlClient.SqlParameterCollection.RangeCheck(Int32 index)
at System.Data.SqlClient.SqlParameterCollection.GetParameter(Int32 index)
at NHibernate.Type.Int32Type.Set(IDbCommand rs, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
at NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
at NHibernate.Impl.StatelessSessionImpl.Insert(String entityName, Object entity)
at NHibernate.Impl.StatelessSessionImpl.Insert(Object entity)

Is it possible to use one column for two different purposes (Foreign key relationship and primary key)?

C# NHibernate Model

public const string STR_ID = "Id";
public const string STR_SHARDKEY = "ShardKey";
public const string STR_OTHERMODEL = "OtherModel";

[CompositeId(-4)]
[KeyProperty(-3, Name = STR_ID, Column = STR_ID)]
[KeyProperty(-2, Name = STR_SHARDKEY , Column = STR_SHARDKEY )]
[Generator(-1, Class = "guid.comb")]
public virtual Guid? Id { get; set; }

[Column(Name = STR_SHARDKEY )]
public virtual int ShardKey{ get; set; }

[ManyToOne(0)]
[Column(1, Name = STR_OTHERMODEL )]
[Column(2, Name = STR_SHARDKEY )]
public virtual OtherModel OtherModel { get; set; }

XML Mapping

<composite-id>
    <key-property name="Id" column="Id" />
    <key-property name="ShardKey" column="ShardKey" />
</composite-id>

<many-to-one name="OtherModel" >
    <column name="OtherModel" />
    <column name="ShardKey" />
</many-to-one>
annemartijn
  • 1,538
  • 1
  • 23
  • 45

0 Answers0