为什么NHibernate使用session.Load()进行数据包往返

时间:2014-08-08 15:15:18

标签: c# session nhibernate proxy

我用

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

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

ActivityAppointment有一个对Activity的引用,我用session.Load()设置 - 但现在,我已经确定,当我调用session.Load()时,NHibernate正在对数据库进行往返。我除外,NHibernate只创建一个代理对象,我可以将其指定为必须保存的DTO的引用。

我也尝试过一个不存在的约会,然后我得到一个例外

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

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

1 个答案:

答案 0 :(得分:1)

您是否禁用了延迟加载(例如&lt; class name =“Activity”lazy =“false”&gt;)?

如果您渴望加载,请加载到数据库,因为没有代理(请参阅此问题NHibernate does not create proxy unless lazy=true)。没有代理 - &gt; sessionLoad命中DB - &gt;不可恢复的例外。

Official documentation

  

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