为什么NHibernate使用session.Load()来往返数据库?



我用

var ap = new ActivityAppointment() {Activity = this.Session.Load<Activity>(appointmentId)};

创建DTO ActivityAppointment并将其保存到数据库。

ActivityAppointment有一个对Activity的引用,我用session.Load()设置了-但是现在,我已经确定,当我调用session.Load()时,NHibernate正在做一个到数据库的往返。我想,NHibernate只是创建一个代理对象,我可以将其作为引用分配给必须保存的DTO。

我也尝试了一个不存在的appointment -然后我得到一个异常

{"No row with the given identifier exists[Prayon.Entities.Activity#df659e2d-6f96-446f-b6ca-452816732a6c]"}  System.Exception {NHibernate.ObjectNotFoundException}

我认为,NHibernate不知道这当它不做一个往返数据库-我认为应该是session.Load()的情况-或者我错了吗?

是否禁用了惰性加载(例如)?

如果你急切,加载到DB,因为没有代理(见这个问题NHibernate不创建代理,除非lazy=true)。No proxy -> sessionLoad hits DB -> unrecoverable exception.

官方文档:

注意,如果没有匹配的数据库,Load()将抛出一个不可恢复的异常行。如果类是用代理映射的,则Load()返回一个对象,该对象是一个未初始化的代理,并且在调用该对象的方法之前不会实际访问数据库。如果您希望创建与对象的关联而不实际从数据库加载对象,则此行为非常有用。

最新更新