gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:59:04 25 4
gpt4 key购买 nike

我有两个关联的业务对象 - 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com