2010-01-24 8 views

Respuesta

36

El reference provided by Brian lo explica con bastante claridad. Sin embargo, la diferencia principal es que Loadno hace clic en en la base de datos para verificar y cargar la entidad que necesita, ya que supone que usted sabe que la entidad existe. El objeto devuelto por Load es algún tipo de proxy que extrae de forma perezosa los datos reales cuando es necesario o lanza una excepción si no se encuentra la entidad.

Resumen:

  • Load se debe utilizar cuando se sabe con certeza que existe una entidad con una cierta identificación. La llamada no da como resultado un acierto de la base de datos (y, por lo tanto, puede ser optimizado por NHibernate en ciertos casos). Tenga cuidado con la excepción que puede surgir cuando se accede al objeto si la instancia de la entidad no existe en el DB.

  • Get llega a la base de datos o al caché de la sesión para recuperar los datos de la entidad. Si la entidad existe, se devuelve; de ​​lo contrario, se devolverá null. Esta es la forma más segura de determinar si existe o no una entidad con cierto ID. Si no está seguro de qué usar, use Get.

+1

Gran respuesta. Hay algunos detalles que pueden ser importantes en algunos casos: AFAIK, 'Load' golpea la base de datos si la carga diferida para la entidad específica está desactivada. 'Load' no devuelve un proxy si la entidad en el caché no es un proxy (mientras que' Get' devuelve un proxy si encontró un proxy en el caché). –

9

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

Get devolverá un valor nulo si el objeto solicitado no existe. Load lanzará una excepción si el objeto solicitado no existe. De lo contrario, funcionan exactamente de la misma manera que yo puedo decir.

+6

Puede ser más claro decir que (Load()) devolverá un proxy (si no se encuentra) que arrojará una excepción (probablemente una referencia nula) si intenta hacer algo con él. – JasonCoder

1

Obtener devolverá nulo si el objeto no existe mientras Load no devolverá nulo: devuelve un objeto o arroja una excepción.

2

La carga es la forma optimizada en algunos casos. Pensemos en una relación de Cliente, Pedido y supongamos que tenemos una tabla de Pedidos con ID de Cliente como clave externa.

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

pesar de que sólo necesitamos la customerId a conservar el objeto orden, por encima de bloque de código se seleccione en primer lugar con el cliente que customerId de la tabla Clientes después haga clic en la base de datos de nuevo para insertar la orden para ese cliente.

Pero si usamos: se ejecutará

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

únicamente la instrucción de inserción con el que customerId. La carga es la forma adecuada en este caso.

Cuestiones relacionadas