Nhibernate:具有HasMany的组件

时间:2010-02-04 23:04:31

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有这个映射:

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 =: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

那么当前映射是否可以在数据库中查询具有特定历史记录日期的实体?

谢谢

1 个答案:

答案 0 :(得分:0)

这很容易...... 问题出在路径上: “从实体e中选择e,其中e.StateHistory.Items.Date =:date”

如果我这样做:

“从实体e中选择e加入e.StateHistory.Items i,其中i.Date =:date”

它有效