В чем разница между Get<T>(object id)
и Load<T>(object id)
? Документация в значительной степени читает то же самое. Кроме того, если это имеет значение, в каких случаях я должен использовать один над другим?
Разница между Get <T> и Load <T>
Ответ 1
Ссылка предоставленная Брайаном, объясняет это довольно четко. Однако разница main заключается в том, что Load
не попадает в базу данных для проверки и загрузки требуемого объекта, поскольку предполагается, что вы знаете, что сущность существует. Объект, возвращаемый Load
, является своего рода прокси-сервером, который лениво извлекает реальные данные при необходимости или генерирует исключение, если объект не найден.
Резюме:
-
Load
следует использовать, если вы точно знаете, что существует сущность с определенным идентификатором. Вызов не приводит к попаданию базы данных (и, в некоторых случаях, может быть оптимизирован NHibernate). Остерегайтесь исключения, которое может возникать при доступе к объекту, если экземпляр объекта не существует в БД. -
Get
удаляет базу данных или кеш сеанса для извлечения данных сущности. Если сущность существует, она возвращается, в противном случае возвращаетсяnull
. Это самый безопасный способ определить, существует ли сущность с определенным идентификатором. Если вы не знаете, что использовать, используйтеGet
.
Ответ 2
Get возвращает null, если запрошенный объект не существует. Загрузка вызовет исключение, если запрошенный объект не существует. В противном случае они работают точно так же, насколько я могу судить.
Ответ 3
В некоторых случаях загрузка оптимизирована. Подумайте о взаимоотношениях с Клиентом, Заказчиком и предположите, что у нас есть таблица ордеров с CustomerId в качестве внешнего ключа.
var order = new Order {OrderDate = Datetime.Now };
order.Customer = session.Get<Customer>(customerId);
session.Save(order);
Хотя нам нужно только clientId для сохранения объекта заказа, над блоком кода сначала выберите клиента с этой клиентской информацией из таблицы Customers, а затем снова удалите базу данных, чтобы вставить заказ для этого клиента.
Но если мы использовали:
order.Customer = session.Load<Customer>(customerId);
будет выполнен только оператор insert с этим clientId. В этом случае загрузка является подходящим способом.
Ответ 4
Get возвращает Null, если объект не существует, тогда как Load не возвращает Null - он либо возвращает объект, либо генерирует исключение.