8

Sto provando a completare un primo passaggio con Nibernate fluente con SQL Server Express, per aggiungere queste funzionalità nel mio progetto. Ma ho qualche errore. Siccome sono novizio da inibire, non ho potuto risolvere un problema per un po 'di tempo. Ho un'entità conErrore di setter privato Fluent Nhibernate e Sql Server

Id { get; private set; } 

di accesso. E questa entità è mappata alla tabella con la colonna identity {1,1} in sql server. Ma durante la creazione di fabbrica Sessione, ottengo un errore:

The following types may not be used as proxies:Entity: method set_Id should be 'public/protected virtual' or 'protected internal virtual' 

Capisco che setter privata viene utilizzata per incapsulare l'impostazione di questa proprietà, ma perché ottengo questo errore, allora? PS: esempio sul sito di fluente per nibernato sta usando sqllite db e tutto va bene.

risposta

20

questo è un problema che ha causato dolore per molti utenti NH/FNH, me compreso .

Fino a poco tempo fa, NHibernate ha consentito ai setter privati ​​con oggetti proxy. Ma a partire da NH 3.2, i set privati ​​non sono più consentiti - devono essere "'public/protected virtual' o 'protected internal virtual'", come dice il messaggio di errore.

Questo è un cambio di rottura per un sacco di codice di esempio FNH/NH che è là fuori, ed è particolarmente confuso per i neofiti.

+0

Contrassegnato la tua risposta, è più vicino alla mia domanda. Grazie. –

7

Dichiarare la proprietà come public virtual int Id { get; protected set; }. L'oggetto proxy generato da NHibernate sarà quindi in grado di impostare la proprietà.

Un'altra soluzione può essere quella di utilizzare un campo di supporto:

private int id; 
public int Id 
{ 
    get { return id; } 
} 

e quindi utilizzare la mappatura:

Map(x => x.Id).Access.CamelCaseField(); 
+0

per che cosa viene usato questo CamelCaseField? Realizza manualmente la funzionalità dell'autoproprietà? –

+0

CamelCaseField ordina a NHibernate di utilizzare la reflection per impostare il campo privato, anziché una proprietà pubblica. –