2011-06-22 27 views
7

estoy tratando de utilizar la carga diferida para una propiedad de una de mis entidadesNo persister para: Castle.Proxies. <EntityName> Proxy y lazy = "true" en NHibernate?

La asignación de propiedad es algo como esto:

<property name="Foobar" type="AnsiString" column="FOOBAR" lazy="true"/> 

Sin embargo cuando Tring para salvar a una instancia de estas entidades (usando LINQ), que arroja un DatabaseQueryException con la siguiente excepción interna:

NHibernate.MappingException: No persister para: Castle.Proxies.FooEntityProxy "

Y cuando quito el lazy =" true "item, la excepción ya no se lanza. ¿Cuál es el problema con el uso de lazy = "true" y cómo solucionarlo?

+0

¿Qué pasó con esa propiedad en la sesión, ¿Ha sido cargado o no? ¿Lo has modificado en la sesión? –

+0

¿Es NH2 ou NH3? – Pedro

+0

@Pedro Assembly versión es 3.1 –

Respuesta

2

Si marca una propiedad como flojo, es debe ser un auto virtual propiedad matic (sin cuerpo como public virtual MyType Baz { get; set; }). Si intenta acceder al valor del campo subyacente, en lugar de pasar por la propiedad, eludirá la carga diferida de la propiedad y puede obtener resultados inesperados.

+1

¿qué es una propiedad automática virtual? –

+1

Una propiedad virtual sin cuerpo, p. 'público virtual SomeType Foo {get; conjunto; } ' –

4

Sé que esta es una respuesta tardía, pero tuve el mismo problema antes. Estaba usando un interceptor personalizado para crear los proxies, así que descubrí que el problema era que no había anulado el método "GetEntityName". Analizar el proxy dentro del método GetEntityName y devolver el nombre de la clase adecuada hizo el truco.

En mi caso, tuve un método simple extensión a unproxy mis objetos, llamados "UnProxy", por lo que toda mi implementación de este método era la siguiente:

public override string GetEntityName(object entity) 
{ 
    if (entity == null) 
     return base.GetEntityName(entity); 
    return entity.UnProxy().GetType().FullName; 
} 
Cuestiones relacionadas