studio - nhibernate-deshabilita la carga automática / lazy de registros secundarios para una relación de uno a muchos
nhibernate vs entity framework (2)
Me gustaría saber si hay una forma de desactivar la carga automática de registros secundarios en nHibernate (para uno: muchas relaciones).
Podemos desactivar fácilmente la carga diferida de las propiedades, pero lo que quiero es deshabilitar cualquier tipo de carga automática (lazy y no lenta). Solo quiero cargar datos por consulta (es decir, HQL o Criteria)
Me gustaría definir la relación entre los registros hijo primarios en el archivo de mapeo para facilitar el HQL y ser capaz de unir entidades padre-hijo, pero no quiero que los registros secundarios se carguen como parte del registro padre a menos que se realice una consulta en el el registro principal explícitamente declara que (a través de búsqueda impaciente, etc.).
Ejemplo: La obtención del registro del departamento de la base de datos no debe obtener 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.
Traté de usar ''expulsar'' - 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 en el que intentamos operar el objeto mediante la reflexión y encuentra un tipo no utilizado en el objeto.
Soy un principiante para nHibernate, cualquier puntero o ayuda sería de gran ayuda.
Puede tener el atributo perezoso en la colección. En su ejemplo, el Departamento tiene n empleados, si lazy está habilitada, los empleados no se cargarán de forma predeterminada cuando cargue 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
Dada su solicitud, simplemente no puede mapear de Departamento a Empleados, ni tiene 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.
Aploba si estos ejemplos de código no funcionan de la caja, no estoy cerca de un compilador en este momento
Entonces, su clase de departamento podría verse así:
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 deseaba encontrar empleados para un departamento, debe 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.
Agregado de "Diseño impulsado por el dominio" de Google, o vea la página 125 del libro de Eric Evan sobre Diseño impulsado por el dominio para más información