Diferencia entre Get y Load


¿Cuál es la diferencia entre Get<T>(object id) y Load<T>(object id)? La documentación dice lo mismo. Además, si importa, ¿en qué casos debo usar uno sobre el otro?

 30
Author: Jeroen, 2010-01-24

4 answers

La referencia proporcionada por Brian lo explica muy claramente. Sin embargo, la principal diferencia es que Load no golpea la base de datos para verificar y cargar la entidad que necesita, ya que asume que sabe que la entidad existe. El objeto devuelto por Load es algún tipo de proxy que obtiene perezosamente los datos reales cuando se requiere o lanza una excepción si la entidad no se encuentra.

Recapitulación:

  • Load debe ser utilizado cuando usted sabe con seguridad que existe una entidad con un ID determinado. La llamada no resulta en una visita a la base de datos (y por lo tanto puede ser optimizada por NHibernate en ciertos casos). Tenga cuidado con la excepción que puede surgir cuando se accede al objeto si la instancia de entidad no existe en la base de datos.

  • Get visita la base de datos o la caché de sesión para recuperar los datos de la entidad. Si la entidad existe es devuelta, de lo contrario null será devuelta. Esta es la forma más segura de determinar si una entidad con un ID determinado existe o no. Si no está seguro de qué usar, use Get.

 39
Author: LorenzCK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-26 20:07:03

Http://ayende.com/Blog/archive/2009/04/30/nhibernate-ndash-the-difference-between-get-load-and-querying-by.aspx

Get devolverá null si el objeto solicitado no existe. Load lanzará una excepción si el objeto solicitado no existe. De lo contrario, funcionan exactamente igual por lo que puedo decir.

 10
Author: Brian Hasden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 02:33:36

La carga es la forma optimizada en algunos casos. Pensemos en un Cliente, una relación de pedido y asumamos que tenemos una tabla de pedidos con CustomerID como clave externa.

var order = new Order {OrderDate = Datetime.Now };
order.Customer = session.Get<Customer>(customerId);
session.Save(order);

Aunque solo necesitamos el CustomerID para persistir el objeto order, el bloque de código anterior seleccionará primero el cliente con ese CustomerID de la tabla Customers y luego golpeará la base de datos nuevamente para insertar el pedido para ese cliente.

Pero si usamos:

order.Customer = session.Load<Customer>(customerId);

Solo la instrucción insert con eso customerId será ejecutado. La carga es la manera apropiada en este caso.

 3
Author: uygar donduran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-24 19:42:23

Get devolverá Null si el objeto no existe, mientras que Load no devolverá Null - devuelve un objeto o lanza una excepción.

 1
Author: Waleed Al-Balooshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-24 02:34:42