Supponendo di aver bisogno di mappare un’entità che espone delle proprietà calcolate con FluentNHibernate avete qualche problema…

L’inghippo di fondo è questo: quando mappate una entity, in fase di inizializzazione dei proxy (e qui vado a intuito) il proxy builder cerca tutte le proprietà e si lamenta, con una sonora exception, se una delle proprietà non è virtual o se manca del set accessor. Il messaggio di errore poi è quantomeno fuorviante :-)

Girovagando su internet si trovano tante colorite soluzioni (pezze direi io) tra cui la più bella è quella di disabilitare in toto il proxy validator:

<property name="use_proxy_validator">false</property>

Ma a casa mia non è un’opzione piuttosto una porcata.

Ergo mi sono messo a cercare e salta fuori che FluentNHibernate ha una strana sintassi, che in teoria dovrebbe funzionare, ma che in realtà non produce alcun effetto tangibile:

public SubjectMapping()
{
    this.Not.Map( s => s.RuntimeEvaluatedProperty );

Quel “Not” dovrebbe impedire il tentativo di mapping… ciccia… alla fine la soluzione è comunque semplice:

public SubjectMapping()
{
    this.WithTable( "Subjects" );

    this.Not.LazyLoad();
    
    this.HasMany( s => s.Addresses )
        .LazyLoad()
        .Inverse()
        .Cascade.AllDeleteOrphan()
        .KeyColumnNames.Add( "SubjectId" );

e consiste nel disabilitare il lazy loading a livello di classe (this.Not.LazyLoad()) e riabilitarlo eplicitamente ove serve.

.m