有没有NHibernate不会返回代理对象的情况?

时间:2012-03-23 16:58:00

标签: c# nhibernate fluent-nhibernate

我正在学习Fluent NHibernate(通常还有NHibernate)。我使用自动映射和一些覆盖,但我不认为这对问题很重要(当然,如果我在这里错了,我会很乐意更新问题)。

给定一个ISession(以及一些假设的变量)我可以通过他们的ID返回实体:

using (var session = SessionFactory.OpenSession())
{
    var user = session.Get<User>(userId);
}

我有限的理解是NHibernate围绕User映射实体创建了一个代理,但是当我测试它时(based on this):

Assert.That(user is INHibernateProxy, "Not a proxy.");

好像我的实例不是代理。

有没有使用代理的情况?我希望找到&#34;缺失的部分&#34;并且祈祷这不是星期五下午大脑失败。

4 个答案:

答案 0 :(得分:3)

通常代理用于延迟加载。每当您通过Get等获取权限时,您都不会获得代理,而是获取真实对象。如果没有必要,NHibernate不会使用代理。

但如果userAddress,则user.Address is INHibernateProxy为真(除非此关系延迟加载)。

有关NHibernate处理代理的方式和时间的更多信息,请参阅this article

答案 1 :(得分:3)

ISession.Get始终返回null或真实对象。 ISession.Load OTOH 可以返回代理(或抛出异常),但代理是另一个故事:你的持久化类应满足一些前提条件(虚拟属性,非密封等)

答案 2 :(得分:2)

有些问题永远不会太老了;) 在现实生活中,通常通过访问逆关系的“父级”或通过Load()加载对象来获得代理。但是,如果该对象之前已经被加载到缓存中,您将获得第一次访问的类型。因此,Load / Get可能都返回代理或真实实例。

        // if object has been loaded, load will return real instance
        using (var session = CreateSession())
        {
            postByGet = session.Get<Post>(post1Id);
            postByLoad = session.Load<Post>(post1Id);

            Assert.IsFalse(postByGet is INHibernateProxy);
            Assert.IsFalse(postByLoad is INHibernateProxy);
            Assert.IsTrue(object.ReferenceEquals(postByGet, postByLoad));
        }

        // if proxy has been loaded, get will return filled proxy
        using (var session = CreateSession())
        {
            postByLoad = session.Load<Post>(post1Id);
            postByGet = session.Get<Post>(post1Id);

            Assert.IsTrue(postByGet is INHibernateProxy);
            Assert.IsTrue(postByLoad is INHibernateProxy);
            Assert.IsTrue(object.ReferenceEquals(postByGet, postByLoad));
        }

答案 3 :(得分:0)

正如NOtherDev所说,代理是懒惰加载。但即使Session.Get有时也会返回代理。这让我多次措手不及。如果您通过指定lazy="true"来对表中的任何列使用延迟加载:

<property name="Description" type="StringClob" not-null="false" lazy="true"/>

Session.Get将始终返回此类型的代理,并且无法取消该对象的代理。实际上,代理是真实的对象。

顺便说一下,禁用延迟加载确实是一个坏主意。您可以在此处详细了解:NHibernate is lazy, just live with it