2010-02-04 5 views
2

J'ai cette cartographie:Nhibernate: Composant avec 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()); 
       ... 
     } 
} 

Je veux faire une requête où je reçois une date précise (TransitionDate) dans une entrée EntityStateHistory. S'il était possible, il serait quelque chose comme ceci:

« select e de l'entité e où e.StateHistory.Items.Date =: Date »

mais je ne peux pas faire cela, je ne savoir comment je peux accéder à une date d'enregistrement historique, sachant que l'historique est un composant qui a lui-même une collection de composants, et j'ai besoin d'accéder à l'une des propriétés de ces composants dans la collection.

Le modèle d'objet est quelque chose comme ceci:

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

    ... 

}

Je sais que je vais probablement changer le mappage pour l'entité, et de créer une carte pour EntityStateHistory, mais je voudrais éviter cela, parce que cela signifie une table de plus. La façon dont je l'ai est l'application la plus canonique, car n'a pas besoin de carte HistoryItem ou EntityStateHistory, que je signifie utiliser une seule table pour carte EntityStateHistory:

Tableau EntitiStateHistory: -identity -TransitionDate -Etat

Est-il possible avec le mappage actuel d'interroger la base de données pour une entité qui a une date d'enregistrement d'historique spécifique?

Merci

Répondre

0

Il était si facile ... Le problème était dans le chemin: "sélectionnez e de l'entité e où e.StateHistory.Items.Date =: Date"

si je fais ceci:

"select e de e entité joindre e.StateHistory.Items i où i.Date =: Date"

il fonctionne

Questions connexes