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>