Get <t>和Load <t> </t> </t>之间的区别

时间:2010-01-24 02:29:35

标签: nhibernate

Get<T>(object id)Load<T>(object id)之间有什么区别?文档几乎都是一样的。另外,如果重要的话,我应该在什么情况下使用另一个呢?

4 个答案:

答案 0 :(得分:41)

reference provided by Brian非常清楚地解释了这一点。但是,主要区别在于Load 没有命中数据库以检查并加载您需要的实体,因为它假定您知道该实体存在。 Load返回的对象是某种代理,在需要时可以懒惰地获取实际数据,或者在找不到实体时抛出异常。

回顾:

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

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

答案 1 :(得分:10)

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

如果请求的对象不存在,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 - 它返回一个对象或抛出异常。