2008-10-20 13 views
8

Me gustaría saber si hay una manera de deshabilitar la carga automática de registros secundarios en nHibernate (para uno: muchas relaciones).nhibernate - deshabilitar la carga automática lazy de registros secundarios de una a muchas relacionesih

Podemos desactivar fácilmente la carga diferida en las propiedades, pero lo que quiero es deshabilitar cualquier tipo de carga automática (lazy y no lazy ambos). Solo quiero cargar datos mediante consulta (es decir, HQL o Criteria)

Aún me gustaría definir la relación entre los registros hijo primarios en el archivo de asignación para facilitar HQL y ser capaz de unir entidades secundarias parentales, pero no lo hago quiere que los registros secundarios se carguen como parte del registro principal, a menos que una consulta en el registro principal establezca explícitamente que (a través de la búsqueda ansiosa, etc.).

Ejemplo: Obteniendo el registro del departamento de la base de datos no debe buscar todos los registros de los empleados de la base de datos porque puede que nunca sea necesario.

Una opción aquí es establecer la colección de Empleados en el Departamento como carga diferida. El problema con este enfoque es que una vez que el objeto se asigna a la API que realiza la llamada, puede "tocar" la propiedad de carga diferida y eso obtendrá la lista completa de la base de datos.

Intenté usar 'evict' - para desconectar el objeto pero no parece funcionar en todo momento y no hace un desalojo profundo del objeto. Además, abstrae el tipo de propiedad de carga diferida con una clase de proxy que causa estragos más adelante en el código donde estamos tratando de operar en el objeto a través de la reflexión y encuentra el tipo no utilizado en el objeto.

Soy un principiante de nHibernate, cualquier puntero o ayuda sería de gran ayuda.

+0

Usted tiene un error tipográfico: disbale -> desactivar – Anthony

Respuesta

3

Dada su solicitud, simplemente no puede asignar un departamento a un empleado ni tener una propiedad de empleados en su departamento. Esto significa que siempre tiene que hacer una base de datos para encontrar a los empleados de una base de datos.

aplogies si estos ejemplos de código no trabajan fuera de la caja, no estoy cerca de un compilador en el momento

lo tanto, su departamento de clase podría ser:

public class Department 
{ 
    public int Id { get; protected set; } 
    public string Name { get; set; } 
    /* Equality and GetHashCode here */ 
} 

y su empleado se vería así:

public class Employee 
{ 
    public int Id { get; protected set; } 
    public Name Name { get; set; } 
    public Department Department { get; set; } 
    /* Equality and GetHashCode here */ 
} 

Cada vez que quería encontrar empleados de un departamento, que haya que llamar:

/*...*/ 
session.CreateCriteria(typeof(Employee)) 
    .Add(Restrictions.Eq("Department", department) 
    .List<Employee>(); 

Simplemente porque su especificación dice "Los departamentos tienen muchos empleados", no significa que tenga que asignarlo como una asociación bidireccional. Si puede mantener su dirección unidireccional asociada, realmente puede lograr que su acceso a datos también lo haga.

Google "Domain Driven Design" Aggregate, o consulte la página 125 del libro de Eric Evan en Domain Driven Design para más información

-1

Puede tener el atributo diferido en la colección. En su ejemplo, el Departamento tiene n empleados, si lazy está habilitada, los empleados no se cargarán de manera predeterminada cuando carga un departamento: http://www.nhforge.org/doc/nh/en/#collections-lazy

Puede tener consultas que carguen explícitamente al departamento Y a los empleados. Es la opción "buscar": http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

+0

En el caso de que la consulta no quiere ir a buscar empleados en absoluto -la Los problemas son los empleados que accidentalmente se cargan de forma perezosa si la API que llama accede al getter. Puede ser un arrastre de rendimiento y si hay una forma de desactivarlo. En mi publicación he mencionado algunos problemas que enfrenté al expulsar objetos – dotnetcoder

Cuestiones relacionadas