NHibernate - 访问关联对象的 ID 而不延迟加载整个对象

标签 nhibernate associations lazy-loading

我有两个关联的业务对象 - A 和 B。
关联是 (A->B) 多对一,B.Id 是 A 中的外键(所以 A 在数据库中有 A.B_id)。

我正在使用 lazy=true 并解决了我的大部分问题,
但是在 A 的 ToString 中,我还想打印 A.B.Id,我应该在没有进一步访问数据库的情况下打印它。但是访问 A.B 会激活代理,并且由于这不在打开 session 的上下文中,因此会引发异常。

一种简单但丑陋的解决方案是拥有 A.B_id 属性。但这是我们首先试图避免的东西的一部分。
任何“有机”的方式来做到这一点? :)
谢谢!

更新:只需阅读有关缓存和 Session.Get 与 Session.Load 的信息。之前我只是新的,如果对象不存在(Session.Load)一个抛出异常,另一个返回一个空对象(Session.Get)。阅读缓存后 here ,很明显,Session.Load 返回了一个对象的代理,并且只有在访问 ID 以外的属性时才懒惰地获取它,这非常像我从关联中需要的!
现在我添加了单独的对象 ID(将 B_Id 添加到 A,以便我可以将其作为 A.B_Id 访问,而不是使用 A.B.Id)

最佳答案

如果您使用的是 NHibernate 3.2 或更高版本,则可以使用以下代码获取关联对象的 id,而无需再次往返数据库以加载整个对象:

using NHibernate.Proxy;
...
object id = null;
if (obj.IsProxy()) // obj is the object you want to get its identifier.
{
    var proxy = obj as INHibernateProxy;
    if (proxy != null)
    {
        var li = proxy.HibernateLazyInitializer;
        if (li != null) 
            id = li.Identifier;
    }
}

关于NHibernate - 访问关联对象的 ID 而不延迟加载整个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702068/

相关文章:

ruby-on-rails - ActiveRecord 中多个自连接的多对多关联

android - 将数据从 Web 服务加载到 ListView 的最佳方法

c# - 为什么 ReferenceEquals 和 == 运算符的行为与 Equals 不同

node.js - Sails.js 关联 : "Many" side of one-to-many associations not saving to MongoDB or Postgres (vs. 磁盘数据库)

node.js - Sequelize : Error creating a post and associating it with the current user

java - JPA:延迟加载光滑时刻

java - 如何在 Java 中为成员 arraylist 变量实现惰性初始化?

c# - 对 NHibernate 和 Script# 使用相同的类?

c# - 使用流畅的 nhibernate 映射进行持久性规范测试

c# - MVC 3,在哪里提交工作单元?