Nhibernate Get<;T>;和负载<;T>;

Nhibernate Get<;T>;和负载<;T>;,nhibernate,Nhibernate,Get(objectid)和Load(objectid)之间有什么区别?文档内容大致相同。另外,如果有关系,在什么情况下我应该使用一个而不是另一个? 如果请求的对象不存在,Get将返回null。如果请求的对象不存在,Load将引发异常。否则,据我所知,它们的功能完全相同。如果对象不存在,Get将返回Null,而Load将不返回Null—它要么返回对象,要么抛出异常 这本书解释得很清楚。但是,main的区别在于,Load不会点击数据库来检查和加载所需的实体,因为它假定您知道该实体存在。Load返回

Get(objectid)
Load(objectid)
之间有什么区别?文档内容大致相同。另外,如果有关系,在什么情况下我应该使用一个而不是另一个?


如果请求的对象不存在,Get将返回null。如果请求的对象不存在,Load将引发异常。否则,据我所知,它们的功能完全相同。

如果对象不存在,Get将返回Null,而Load将不返回Null—它要么返回对象,要么抛出异常

这本书解释得很清楚。但是,main的区别在于,
Load
不会点击数据库来检查和加载所需的实体,因为它假定您知道该实体存在。
Load
返回的对象是一种代理,它在需要时惰性地获取真实数据,或者在找不到实体时抛出异常

概述:

  • 当您确定存在具有特定ID的实体时,应使用
    Load
    。该调用不会导致数据库命中(因此在某些情况下可以由NHibernate进行优化)。如果数据库中不存在实体实例,则在访问对象时可能引发异常

  • Get
    点击数据库或会话缓存以检索实体数据。如果实体存在,则返回该实体,否则将返回
    null
    。这是确定具有特定ID的实体是否存在的最安全的方法。如果不确定要使用什么,请使用
    Get


在某些情况下,负载是最佳方式。让我们考虑一个客户、订单关系,并假设我们有一个以CustomerId作为外键的订单表

var order = new Order {OrderDate = Datetime.Now };
order.Customer = session.Get<Customer>(customerId);
session.Save(order);
var order=neworder{OrderDate=Datetime.Now};
order.Customer=session.Get(customerId);
会话。保存(命令);
尽管我们只需要customerId来持久化order对象,但上面的代码块将首先从Customers表中选择具有该customerId的客户,然后再次点击数据库以插入该客户的订单

但如果我们使用:

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

将只执行具有该customerId的insert语句。在这种情况下,加载是合适的方式

更清楚的是,它(Load())将返回一个代理(如果找不到),如果您试图对其执行任何操作,该代理将抛出异常(可能是空引用)。@JasonCoder抛出的异常是一个
ObjectNotFoundException
。但你注意到的确实是正确和重要的。例如,这意味着在
try/catch
中包装
Load
是毫无意义的。答案很好。在某些情况下,有些细节可能很重要:如果关闭了特定实体的延迟加载,那么,
Load
确实会影响数据库<如果缓存中的实体不是代理,则code>Load不返回代理(而
Get
如果在缓存中找到代理,则返回代理)。