Domanda

Sto utilizzando Fluent NHibernate, e auto-mappatura delle classi.

Ho una proprietà calcolata in una classe lungo le linee di

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

Questo non è stato mappato con il resto delle proprietà, quindi non ho potuto usarlo in una restrizione ICriteria. Ho aggiunto un setter vuota (come ho letto da qualche parte che così facendo avrebbe includerlo nella mappatura, che lo fa), ma ora sto ottenendo un errore NHibernate:

  

non ha potuto eseguire la query ... nome di colonna non valido 'LastActionTimeStamp'.

Quindi la mia domanda è: come faccio a dire Fluent NHibernate NHibernate dire di ignorare il database per questa proprietà, ma ancora tornare il valore calcolato dal get proprietà

È stato utile?

Soluzione

Si potrebbe associare una formula con la proprietà e l'uso che al posto del codice C #. per es.

Proprietà:

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

Formula:

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

E quindi è possibile utilizzare postcount nella vostra espressione come al solito. Ricordate di impostare il modificatore di accesso sulla proprietà nel vostro FluentMapping. Non so cosa supporti fluente ma le opzioni che ho trovato per la mappatura normale sono:

* 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

Probabilmente la cosa migliore del check-out la documentazione NHibernate per la lista ufficiale strategie di accesso in modo da combinare la strategia di accesso con la strategia di denominazione per esempio "Field.lowercase-underscore"

Altri suggerimenti

Non sono sicuro che si può fare con NHibernate, ma potrei sbagliarmi. NHibernate traduce i tuoi criteri in SQL, e quindi che la proprietà non sarebbe disponibile per query con (non è nel db!).

Tuttavia, se mi sbaglio (e che di frequente), si dovrebbe essere in grado di mappare con un override.

Nella vostra configurazione automapping, creare un esclusione e la mappa che la proprietà in modo esplicito utilizzando la proprietà Access per dire NHibernate come trattarla.

Qualcosa di simile a questo:

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

Si può anche ignorare la mappatura e ignorare il propery:

public class ThatClassMappingOverride : IAutoMappingOverride<ThatClass>
{
  public void Override(AutoMapping<ThatClass> mapping)
        {
            mapping.IgnoreProperty(x=> x.PropertyToIgnore);
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top