Question

J'utilise Fluent NHibernate et mappage automatique des classes.

I ai une propriété calculée dans une classe le long des lignes de

public virtual DateTime? LastActionTimeStamp
{
    get {
        return Actions.Count == 0 ? null : Actions.OrderByDescending(
            a => a.TimeStamp).ElementAt(0).TimeStamp;
    }
}

Cela n'a pas été mis en correspondance avec le reste des propriétés, donc je ne pouvais pas l'utiliser dans une restriction ICriteria. J'ai ajouté un setter vide (comme je l'ai lu quelque part que ce faisant inclurait dans la cartographie, ce qu'il fait), mais maintenant je reçois une erreur NHibernate:

  

ne pouvait pas exécuter la requête ... Nom de colonne non valide 'LastActionTimeStamp'.

Alors ma question est: comment puis-je dire Fluent NHibernate dire NHibernate ignorer la base de données de cette propriété, mais toujours revenir à la valeur calculée de la propriété get

Était-ce utile?

La solution

Vous pouvez associer une formule à la propriété et l'utiliser au lieu du code c #. par exemple.

Propriété:

private int _postCount = 0;
public virtual int PostCount
{
    get
    {
        return _postCount;
    }
}

Formule:

(SELECT count(p.ID) FROM BlogPost p WHERE p.BlogID = ID and p.IsDeleted = 0)

Et vous pouvez utiliser PostCount dans votre expression comme d'habitude. Rappelez-vous de modifier le type d'accès à la propriété dans votre FluentMapping. Je ne sais pas ce soutien, mais Fluent les options que j'ai trouvé pour la cartographie normale sont:

* property
* field
* field.camelcase
* field.camelcase-underscore
* field.pascalcase-m-underscore
* field.lowercase-underscore
* nosetter.camelcase
* nosetter.camelcase-underscore
* nosetter.pascalcase-m-underscore
* nosetter.lowercase-underscore

Probablement mieux vérifier la documentation NHibernate pour la liste officielle stratégies d'accès afin que vous combinez la stratégie d'accès à la stratégie de nommage par exemple "Field.lowercase-underscore"

Autres conseils

Je ne suis pas certain que vous pouvez le faire avec NHibernate, mais je peux me tromper. NHibernate traduit vos critères dans SQL, et donc que la propriété ne serait pas disponible pour interroger avec (il est pas dans la db!).

Cependant, si je me trompe (et c'est fréquent), vous devriez être en mesure de cartographier avec une dérogation.

Dans la configuration de votre AutoMapping, créez un et passer outre la carte que la propriété en utilisant explicitement la propriété Access de dire NHibernate comment la traiter.

Quelque chose comme ceci:

AutoMap.AssemblyOf<YourEntity>()
  // automapping stuff
  .Override<ThatClass>(m =>
  {
    m.Map(x => x.LastActionTimeStamp)
      .Access.None();
  });

Vous pouvez également remplacer le mappage et ignorer le propery:

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top