nhibernate:在 ManyToOne 属性中使用 CompositeId 的一部分 [英] nhibernate: using parts of the compositeId in a ManyToOne Property
问题描述
我有一个这样的表结构:
I have a tablestructure like this:
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; }
}
是否可以将其映射到实体类?(如果是的话如何)
is it possible to map this to the class Entity? (if yes how)
下面在save时抛出,因为dbcommand里的列不够,一个用了两次:
the following throws on save, because there are not enough columns in the dbcommand, one is used twice:
CompositeId()
.KeyReference(e => e.Other, "otherEntity_id")
.KeyProperty(e => e.Id, "id")
References(e => e.Parent).Columns("otherEntity_id", "parent_id");
使用 xml 或 fluent 都没有关系.
It doesnt matter using xml or fluent.
没有参考映射没有错误,参考映射跟随错误(我多次遇到此错误,每次当我的值多于映射列时):
without the reference mapped no error, with reference mapped following error (i had this error several times, everytime when i have more values than mapped columns):
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()
测试代码
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);
如果不可能,请有人告诉我吗?
if it's not possible could please someone tell me?
推荐答案
我还没找到解决方案,将我的模型映射到:
I still haven't found a solution and mapped changed my model to:
public class Entity
{
public OtherEntity Other { get; set; }
// simple int to discriminate different Entity for the same OtherEntity
public int Id { get; set; }
public int ParentId { get; set; }
}
这篇关于nhibernate:在 ManyToOne 属性中使用 CompositeId 的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!