2010-02-04 32 views
2

我有這樣的映射:NHibernate的:組件用的hasMany

public sealed class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     ... 
     Component(entity => entity.StateHistory, 
       m => m.HasMany<HistoryItem<EntityState>> 
        (Reveal.Property<EntityStateHistory>("Items")) 
        .Table("EntityStateHistory") 
        .KeyColumn("IDEntity") 
        .Component 
        (m2 => 
         { 
          m2.Map(esh => esh.Item, "State") 
           .CustomType(typeof(EntityState)).Not.Nullable(); 
          m2.Map(esh=> esh.Date, "TransitionDate").Not.Nullable(); 

         } 
        ) 
        .Cascade.AllDeleteOrphan()); 
       ... 
     } 
} 

我想打一個查詢在那裏我得到一個EntityStateHistory進入某一特定日期(TransitionDate)。 如果有可能會是這樣的:

「選擇E從實體e其中e.StateHistory.Items.Date =:日期」

,但我不能這樣做,我不知道我如何訪問歷史記錄日期,知道歷史是一個組件,它本身擁有一個組件集合,而且我需要訪問集合中這些組件的屬性之一。

對象模型是這樣的:

public class Entity 
{ 
    private int ID {get; set;} 
    etc 
    ... 
    public virtual EntityStateHistory StateHistory{ get; private set; } 
} 

public class EntityStateHistory: History<EntityState> 
{ 
    //some wraped properties and methods 
    public IList<HistoryItem<EntityState>> StateRecords 
    { 
     get { return base.Items;} 
    } 

    public bool ContainsStateRecord(EstadoOT state) 
    { 
     return base.Items.Count(i => i.Item.Equals(state)) > 0; 
    } 
    etc ... 
} 

public class History<T> 
{ 

    protected virtual IList<HistoryItem<T>> Items { get; private set; } 

    public History() 
    { 
     Items = new List<HistoryItem<T>>(); 
    } 

    protected virtual HistoryItem<T> AddHistoryItem(DateTime data, T item) 
    { 
     ... 
    } 
} 

public class ItemHistory<T> 
{ 
    #region NHibernate 
    private int ID { get; set; } 
    #endregion 

    public virtual DateTime Date { get; private set; } 
    public virtual T Item { get; private set; } 

    ... 

}

我知道我可能將不得不改變對實體的映射,並創建一個地圖EntityStateHistory,但我想,以避免那是因爲那意味着更多的表格。我的方式有它是最典型映射,因爲已經沒有必要映射HistoryItem或EntityStateHistory,這意味着我只使用一個表來映射EntityStateHistory:

表EntitiStateHistory: -Identity -TransitionDate -State

那麼是否有可能使用當前映射來查詢具有特定歷史記錄日期的實體的數據庫?

感謝

回答

0

它是那麼容易...... 的問題是在路徑: 「從實體E選擇e其中e.StateHistory.Items.Date =:日期」

如果我這樣做這樣的:

「從實體E選擇Ë加入e.StateHistory.Items哪裏i.Date =:日期」

它的工作原理

相關問題