我用
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()的情况 - 或者我错了吗?
答案 0 :(得分:1)
您是否禁用了延迟加载(例如&lt; class name =“Activity”lazy =“false”&gt;)?
如果您渴望加载,请加载到数据库,因为没有代理(请参阅此问题NHibernate does not create proxy unless lazy=true)。没有代理 - &gt; sessionLoad命中DB - &gt;不可恢复的例外。
请注意,如果没有匹配的数据库,Load()将抛出不可恢复的异常 行。如果使用代理映射类,则Load()将返回一个未初始化的代理对象,并且在调用对象的方法之前不会实际访问数据库。如果您希望创建与对象的关联而不实际从数据库加载它,则此行为非常有用。