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