nhibernate - why - instagram hashtags on comments or caption
Diferencia entre Get<T> y Load<T> (4)
¿Cuál es la diferencia entre Get<T>(object id)
y Load<T>(object id)
? La documentación prácticamente lee lo mismo. Además, si es importante, ¿en qué casos debo usar uno sobre el otro?
Get devolverá Null si el objeto no existe, mientras que Load no devolverá Null, devuelve un objeto o arroja una excepción.
La referencia proporcionada por Brian lo explica muy claramente. Sin embargo, la principal diferencia es que Load
no llega a 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 un 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
debe utilizar cuando sepa con seguridad que existe una entidad con un ID determinado. 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
visitas 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 una determinada ID. Si no estás seguro de qué usar, usaGet
.
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);
Aunque solo necesitamos que el ID de cliente persista en el objeto de orden, el bloque de código anterior seleccionará primero al cliente con esa tabla customerId de Customers y luego volverá a presionar la base de datos para insertar el pedido para ese cliente.
Pero si utilizamos:
order.Customer = session.Load<Customer>(customerId);
solo se ejecutará la instrucción insert con ese ID de cliente. La carga es la forma adecuada en este caso.
Get devolverá nulo si el objeto solicitado no existe. La carga lanzará una excepción si el objeto solicitado no existe. De lo contrario, funcionan exactamente de la misma manera que yo puedo decir.