gpt4 book ai didi

c# - NHibernate Futures 有时返回 Proxy,其他则返回 Entity

转载 作者:行者123 更新时间:2023-11-30 19:28:18 26 4
gpt4 key购买 nike

我有一个数据库提取,它使用多个 future 查询来处理完整的对象图。它看起来像这样(已更改类名以保护无辜者):

Foo foo;
var fooFuture = Session.QueryOver<Foo>()
.Where(f => f.Id == id)
.Future();

// load up the Blah collection for the Foo
Session.QueryOver<Foo>()
.Fetch(f => f.Blahs).Eager
.Where(f => f.Id == id)
.Future();

// do a separate query for the BlahOptions -- this is needed
// because if we did a Join and Join off of Foo, we'd get duplicate Blah
// results and that's not good
Session.QueryOver<Blah>()
.Fetch(b => b.Options).Eager
.Where(b => b.Foo.Id == id)
.Future();

// load up the Attributes for the Foo
Session.QueryOver<Foo>()
.Fetch(f => f.Attributes).Eager
.Where(f => f.Id == id)
.Future();

foo = fooFuture.SingleOrDefault();

注意:我可以在 NHibernate LINQ 中实现它,但行为保持不变。

怪异之处: foo 有时是 FooNamespace.Foo 类型(正确的具体类型),而其他时候是 CaSTLe.Proxies.FooProxy.

我得到的是真实类型还是代理类型似乎取决于先前是否在 session 中使用过 NHibernate。当此查询发生在其他 NHibernate 查询之后时,它会返回一个 FooProxy。如果这是 session 的第一次使用,它会返回一个 Foo

为什么会这样?我怎样才能防止它发生?我有目的地获取 Foo 的整个对象图以确保没有代理。并且图本身不包含任何代理,它只是根 Foo 引用。返回的类型取决于 NHibernate 之前所做的事情这一事实似乎是关键(而且真的很奇怪)。

一些结束语:

  • NHibernateUtil.IsInitialized 在输入 FooProxy 时返回 true,所以我不能保证它不是那种方式的代理
  • 我反对代理,因为图形将被序列化以用于缓存目的,并且在使用 FooProxy 时反序列化会崩溃

非常感谢任何见解!

最佳答案

通常会发生这种情况的原因是因为 Foo 在此之前已加载到 session 中的其他位置,并且您正在获取在先前查询中创建的代理。

我在以下方面取得了一些成功

var fooProxy = foo as INHibernateProxy;
if(fooProxy != null) {
var context= Session.GetSessionImplementation().PersistenceContext;
foo = context.Unproxy(fooProxy);
}

虽然,在大多数情况下,序列化过程似乎将 Proxy 转换为正确的类型。

关于c# - NHibernate Futures 有时返回 Proxy,其他则返回 Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068618/

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