8

Estoy tratando de completar un primer paso con fluencia nhibernate con sql server express, para agregar estas características en mi proyecto. Pero tengo algunos errores. Como soy novato en nhibernate, no pude resolver un problema por un tiempo. Tengo una entidad conDominio privado de Nhibernate y Sql Servidor error

Id { get; private set; } 

descriptores de acceso. Y esta entidad se asigna a la tabla con la columna de identidad {1,1} en el servidor sql. Sin embargo, durante la creación de la fábrica de sesión, me sale un error:

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

entiendo que colocador privada se utiliza para encapsular configuración de esta propiedad, pero ¿por qué recibo este error, entonces? PD: ejemplo en el sitio de fluidez para nhibernate está utilizando sqllite db y todo está bien.

Respuesta

20

Este es un tema que ha causado dolor por muchos usuarios NH/FNH, incluido yo .

Hasta hace poco, NHibernate ha permitido a los instaladores privados con objetos proxy. Pero comenzando con NH 3.2, los setters privados ya no se permiten - deben ser "public/protected virtual 'o' protected internal virtual '", como dice el mensaje de error.

Este es un cambio decisivo para una gran parte del código de muestra FNH/NH que existe, y es especialmente confuso para los novatos.

+0

Marcó su respuesta, está más cerca de mi pregunta. Gracias. –

7

Declare la propiedad como public virtual int Id { get; protected set; }. El objeto proxy generado por NHibernate podrá establecer la propiedad.

Otra solución puede ser el uso de un campo de respaldo:

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

Y a continuación, utilizar la asignación:

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

¿para qué se utiliza CamelCaseField? ¿Realiza manualmente la functinalidad de autopropiedad? –

+0

CamelCaseField indica a NHibernate que use la reflexión para establecer el campo privado, en lugar de una propiedad pública. –