Ho una classe di qualcosa di simile a questo:Ignorando metodi su tipi di entità con NHibernate
public class Account
{
public virtual int Id { get; private set; }
public virtual string Username { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public virtual string Password { get; private set; }
public void SetPassword(string password){ ... }
public bool CheckPassword(string password) { ... }
}
ho impostato su questo senso dal momento che non voglio più la proprietà Password
utilizzata direttamente nel codice che utilizza il tipo Account
. La mappa account simile a questa:
public class AccountMap : ClassMap<Account>
{
public AccountMap()
{
Id(x => x.Id);
Map(x => x.Username);
Map(x => x.Password);
}
}
Quando Io in realtà uso questo con NHibernate ottengo un InvalidProxyTypeException
NHibernate.InvalidProxyTypeException: The following types may not be used as proxies:
Fringine.Users.Account: method SetPassword should be virtual
Fringine.Users.Account: method CheckPassword should be virtual
Capisco che NHibernate sta cercando di creare una classe proxy per supportare il caricamento pigro e che Posso contrassegnare i metodi come virtuali aggiungere un Not.LazyLoad() alla mappa per risolvere l'eccezione. Ma - Non voglio fare nessuna di quelle. Voglio supportare il caricamento lento, ma non vedo perché questi metodi debbano essere virtuali.
NHibernate (o Castle internamente) valuta il contenuto del metodo per determinare quali campi vengono utilizzati e ottimizzare il carico lento per tali proprietà? In caso contrario, perché il metodo deve essere virtuale se tutte le proprietà sono e saranno pigre-caricate quando vengono referenziate dal metodo.
Esiste un modo per escludere determinati metodi dal requisito virtuale?
Non sono sicuro che importi se accedo a un campo con questi metodi. Quando si accede al campo tramite la sua proprietà proxy, inizializzerà l'istanza. Le sole proprietà/metodi che devono effettivamente essere virtualizzati sono quelle che rappresentano effettivamente le colonne nella tabella. –
@Paul: No, fraintendimenti. Puoi * accedere * ai campi * direttamente * nei tuoi metodi. Non c'è niente di sbagliato in questo, non è necessario preoccuparsi del caricamento lento in questo caso. Il codice nelle tue entità è * sempre * eseguito all'interno di un'entità completamente inizializzata. Questo rende l'NH più trasparente. In realtà è raro avere membri di istanze che non dipendono dallo stato dell'istanza, quindi c'è uno spazio molto limitato per l'ottimizzazione. –
Ah, ho frainteso. La protezione dell'accesso al campo ha senso. –