Get<T>(object id)
和Load<T>(object id)
之间有什么区别?文档几乎都是一样的。另外,如果重要的话,我应该在什么情况下使用另一个呢?
答案 0 :(得分:41)
reference provided by Brian非常清楚地解释了这一点。但是,主要区别在于Load
没有命中数据库以检查并加载您需要的实体,因为它假定您知道该实体存在。 Load
返回的对象是某种代理,在需要时可以懒惰地获取实际数据,或者在找不到实体时抛出异常。
回顾:
Load
。该调用不会导致数据库命中(因此在某些情况下可以通过NHibernate进行优化)。请注意,如果数据库中不存在实体实例,则在访问对象时可能引发异常。
Get
命中数据库或会话缓存以检索实体数据。如果实体存在则返回,否则将返回null
。这是确定具有特定ID的实体是否存在的最安全的方法。如果您不确定要使用什么,请使用Get
。
答案 1 :(得分:10)
如果请求的对象不存在,Get将返回null。如果请求的对象不存在,Load将抛出异常。否则,就我所知,它们的功能完全相同。
答案 2 :(得分:3)
在某些情况下,加载是优化的方式。让我们考虑一下Customer,Order关系,并假设我们有一个Orders表,其中CustomerId作为外键。
var order = new Order {OrderDate = Datetime.Now };
order.Customer = session.Get<Customer>(customerId);
session.Save(order);
虽然我们只需要customerId来持久保存订单对象,但上面的代码块将首先从Customers表中选择具有该customerId的客户,然后再次点击数据库以插入该客户的订单。
但如果我们使用:
order.Customer = session.Load<Customer>(customerId);
只会执行带有该customerId的insert语句。在这种情况下,加载是适当的方式。
答案 3 :(得分:1)
如果对象不存在,Get将返回Null,而Load将不返回Null - 它返回一个对象或抛出异常。