的compositeId使用部分我有这样的tablestructure:NHibernate的:在多对一物业
Table entity
(
otherEntity_id int // primarykey
id int // primarykey
parent_id int
)
和类
public class Entity
{
public OtherEntity Other { get; set; }
// simple int to discriminate different Entity for the same OtherEntity
public int Id { get; set; }
public Entity Parent { get; set; }
}
是有可能这个映射到实体类? (如果是如何)
以下保存时抛出,因为没有在足够的DbCommand列,一个使用了两次:
CompositeId()
.KeyReference(e => e.Other, "otherEntity_id")
.KeyProperty(e => e.Id, "id")
References(e => e.Parent).Columns("otherEntity_id", "parent_id");
它不事使用XML或流畅。
编辑: 没有参考映射没有错误,具有映射以下错误 参考(我有这个错误几次,每次当我有更多的值比对应的字段):
System.ArgumentOutOfRangeException: System.ArgumentOutOfRangeException : Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index
bei System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
bei System.ThrowHelper.ThrowArgumentOutOfRangeException()
bei System.Collections.Generic.List`1.get_Item(Int32 index)
bei Npgsql.NpgsqlParameterCollection.get_Item(Int32 index)
bei Npgsql.NpgsqlParameterCollection.GetParameter(Int32 index)
bei System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item(Int32 index)
bei NHibernate.Type.Int16Type.Set(IDbCommand rs, Object value, Int32 index)
bei NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index)
bei NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session)
bei NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session)
bei NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate(Object id, Object[] fields, Object rowId, Boolean[] includeProperty, Boolean[][] includeColumns, Int32 table, IDbCommand statement, ISessionImplementor session, Int32 index)
bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Boolean[] notNull, Int32 j, SqlCommandInfo sql, Object obj, ISessionImplementor session)
bei NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object id, Object[] fields, Object obj, ISessionImplementor session)
bei NHibernate.Action.EntityInsertAction.Execute()
bei NHibernate.Engine.ActionQueue.Execute(IExecutable executable)
bei NHibernate.Engine.ActionQueue.ExecuteActions(IList list)
bei NHibernate.Engine.ActionQueue.ExecuteActions()
bei NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions(IEventSource session)
bei NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event)
bei NHibernate.Impl.SessionImpl.Flush()
testcode
var e1 = new Entity { Id = 2, Other = other };
var e2 = new Entity { Id = 3, Other = other, Parent = e1 };
Session.Save(e1);
Session.Save(e2);
Session.Flush(); // throws here
Session.Clear();
var key = new Entity { Id = e2.Id, Other = e2.Other };
var loaded = Session.Get<Entity>(key);
编辑:
如果它不可能会请人告诉我?
我看不要在多对一的关系从一个角度NHibernate的点存在。实体类只能包含一个父引用,并且只能包含一个OtherEntity引用。你能否提供信息[沿着这个问题的行](http://stackoverflow.com/questions/5900383/fluent-nhibernate-mapping-children-with-composite-keys-yielding-null-references)澄清关系。 – 2011-05-18 16:39:53
OtherEntity具有实体的集合,并且每个实体都有一个父实体(如果它是从它派生的)。为了引用(manytoone)它的父对象,实体必须保存实体的主键(otherEntity_id,id),但是在实体表中它使用自己的主键部分otherEntity_id而不是另一列parent_otherEntity_id。 – Firo 2011-05-19 07:26:26
你为什么使用复合ID? – 2011-05-27 17:49:03