【问题标题】:Why is NHibernate do roundtrip to the database with session.Load()为什么 NHibernate 使用 session.Load() 往返数据库
【发布时间】:2014-08-08 15:15:18
【问题描述】:

我用

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

创建一个 DTO ActivityAppointment 将其保存到数据库中。

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

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

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

我认为,NHibernate 不知道这一点,当它不往返数据库时 - 我认为 session.Load() 应该是这种情况 - 还是我错了?

【问题讨论】:

标签: c# session nhibernate proxy


【解决方案1】:

您是否禁用了延迟加载(例如 )?

如果您急于求成,则加载到数据库,因为没有代理(请参阅此问题 NHibernate does not create proxy unless lazy=true)。没有代理 -> sessionLoad 命中数据库 -> 不可恢复的异常。

Official documentation:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多