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的实体时,应使用
。该调用不会导致数据库命中(因此在某些情况下可以由NHibernate进行优化)。如果数据库中不存在实体实例,则在访问对象时可能引发异常Load
点击数据库或会话缓存以检索实体数据。如果实体存在,则返回该实体,否则将返回Get
。这是确定具有特定ID的实体是否存在的最安全的方法。如果不确定要使用什么,请使用null
Get
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
如果在缓存中找到代理,则返回代理)。