2011-05-18 50 views
0

的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); 

編輯:

如果它不可能會請人告訴我?

+0

我看不要在多對一的關係從一個角度NHibernate的點存在。實體類只能包含一個父引用,並且只能包含一個OtherEntity引用。你能否提供信息[沿着這個問題的行](http://stackoverflow.com/questions/5900383/fluent-nhibernate-mapping-children-with-composite-keys-yielding-null-references)澄清關係。 – 2011-05-18 16:39:53

+0

OtherEntity具有實體的集合,並且每個實體都有一個父實體(如果它是從它派生的)。爲了引用(manytoone)它的父對象,實體必須保存實體的主鍵(otherEntity_id,id),但是在實體表中它使用自己的主鍵部分otherEntity_id而不是另一列parent_otherEntity_id。 – Firo 2011-05-19 07:26:26

+0

你爲什麼使用複合ID? – 2011-05-27 17:49:03

回答

0

我還沒有找到一個解決方案,並映射改變了我的模型:

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; } 
} 
0

如果您要引用兩次以上(otherEntity_id)相同的專欄中,我看到了這樣的映射來避免這種錯誤的:

References(e => e.Parent).Columns("otherEntity_id", "parent_id") 
    .Not.Update() 
    .Not.Insert(); 

此外,當您正在運行到一個問題,它始終是有益的顯示您正在運行的完整錯誤消息。

+0

不錯的想法,不幸的是,這可以防止兩列插入(檢查SQL),但我只需要第一個被忽略 – Firo 2011-05-19 07:44:19