8

Ich versuche, einige erste Schritt mit fließenden Nhibernate mit SQL Server Express zu vervollständigen, um diese Funktionen in meinem Projekt hinzuzufügen. Aber einige Fehler. Da ich Neuling bin, konnte Nhibernate ein Problem für einige Zeit nicht lösen. Ich habe ein Unternehmen mitFluent Nhibernate und Sql Server private Setter Fehler

Id { get; private set; } 

Accessoren. Und diese Entität wird der Tabelle mit der Identitätsspalte {1,1} auf dem SQL-Server zugeordnet. Aber während Session Fabrik erstellen, bekomme ich einen Fehler:

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

Ich verstehe, dass private Setter verwendet Einstellung dieser Eigenschaft zu kapseln, aber warum bekomme ich diesen Fehler dann? PS: Beispiel vor Ort fließend für Nhibernate verwendet SQLLite db und alles ist in Ordnung.

Antwort

20

Dies ist ein Thema, das Leid für viele NH/FNH Benutzer verursacht hat, mich eingeschlossen .

Bis vor kurzem hat NHibernate privaten Setter mit Proxy-Objekten erlaubt. Aber beginnend mit NH 3.2, private Setter sind nicht mehr erlaubt - sie müssen "öffentlichen/geschützten virtuellen 'oder' geschützten internen virtuellen '", wie die Fehlermeldung sagt.

Dies ist eine bahnbrechende Änderung für viele der FNH/NH-Beispielcode, die da draußen ist, und ist besonders verwirrend für Neulinge.

+0

Markierte deine Antwort, es ist näher an meiner Frage. Vielen Dank. –

7

Deklarieren Sie die Eigenschaft als public virtual int Id { get; protected set; }. Das von NHibernate generierte Proxy-Objekt kann dann die Eigenschaft festlegen.

können andere Lösung sein, ein Trägerfeld zu verwenden:

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

Und dann Mapping verwenden:

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

was für wird dieses CamelCaseField verwendet? Wird die Autoproperty-Funktionalität manuell implementiert? –

+0

Das CamelCaseField weist NHibernate an, Reflection zu verwenden, um das private Feld anstelle einer öffentlichen Eigenschaft festzulegen. –