que tienen un problema con los proxies sin inicializar en nhibernateObtención de proxies del tipo correcto en NHibernate
El modelo de dominio
Digamos que tengo dos jerarquías de clases paralelas: animal, perro, gato y AnimalOwner, DogOwner, CatOwner donde Dog y Cat heredan de Animal y DogOwner y CatOwner heredan de AnimalOwner. AnimalOwner tiene una referencia de tipo Animal llamado OwnedAnimal.
Aquí están las clases en el ejemplo:
public abstract class Animal
{
// some properties
}
public class Dog : Animal
{
// some more properties
}
public class Cat : Animal
{
// some more properties
}
public class AnimalOwner
{
public virtual Animal OwnedAnimal {get;set;}
// more properties...
}
public class DogOwner : AnimalOwner
{
// even more properties
}
public class CatOwner : AnimalOwner
{
// even more properties
}
Las clases tienen mapeo nhibernate adecuada, todas las propiedades son persistentes y todo lo que puede ser cargado ligeramente es cargado ligeramente.
La lógica de negocios de la aplicación solo le permite establecer un Perro en un Propietario de Perro y un Gato en un Propietario de Producto.
El problema
tengo código como este:
public void ProcessDogOwner(DogOwner owner)
{
Dog dog = (Dog)owner.OwnedAnimal;
....
}
Este método puede ser llamado por muchos métodos diffrent, en la mayoría de los casos el perro ya está en la memoria y todo está bien, pero raramente el perro no está ya en la memoria, en este caso obtengo un nhibernate "proxy no inicializado" pero el elenco arroja una excepción porque nhibernate genrates un proxy para Animal y no para Dog.
Entiendo que así es como funciona nhibernate, pero necesito saber el tipo sin cargar el objeto o, más correctamente, necesito que el proxy no inicializado sea un proxy de Cat o Dog y no un proxy de Animal.
Restricciones
- No puedo cambiar el modelo de dominio, el modelo es entregado a mí por otro departamento, traté de conseguir que se cambie el modelo y han fracasado.
- El modelo real es mucho más complicado que el ejemplo y las clases tienen muchas referencias entre ellas, usar carga ansiosa o agregar combinaciones a las consultas está fuera de cuestión por razones de rendimiento.
- Tengo control total del código fuente, el mapeo hbm y el esquema de la base de datos y puedo cambiarlos como yo quiera (siempre que no cambie las relaciones entre las clases de modelo).
- Tengo muchos métodos como el del ejemplo y no quiero modificarlos todos.
Gracias,
Nir
Gracias, no estoy seguro de que pueda usar esas técnicas en mi caso, pero las voy a verificar. – Nir
Agregado a otras opciones ('no-proxy' y' CastEntity'). –
CastEntity fue un buen intento, pero hay un problema con el que me estoy encontrando: si tienes clases principales y secundarias, y la instancia "p" del tipo Parent es realmente un elemento secundario (polimorfismo), el elenco falla el tiempo de compilación aunque lo haría trabajo en tiempo de ejecución. También tenga en cuenta que su primer "INhibernateProxy" carece de un capital en la "h". Cambiar a un "como" no ayudó, pero el truco del "Ser" funcionó. –