NHibernate - Lazy-Loading基元类型

时间:2010-01-19 18:14:51

标签: c# sql asp.net-mvc nhibernate lazy-loading

我正在使用NHibernate将一些对象加载到我的ASP.NET MVC应用程序中。

例如,提交是由用户提交的,我想显示用户的用户名(但只显示用户名),如下所示:

<%= Html.Encode(item.User.UserName) %>

当我使用NHibernate加载提交时,用户从数据库延迟加载,这意味着只有在我调用上面的代码行时才会生成并执行实际的SQL查询(加载用户信息)是我想要的。)

问题是SQL查询还会选择有关用户的其他信息,例如密码,电子邮件等。显然不需要这些信息并将其丢弃。

SQL查询如下所示:

SELECT id, username, password, email FROM User WHERE Id = 1;

我得出结论,NHibernate只对我映射到数据库中的表的其他对象进行延迟加载引用。它似乎没有延迟加载基本的原始类型,如字符串,整数等。

我能这样做吗?当上面的代码被选中时,我希望SQL查询看起来像这样:

SELECT username FROM User WHERE Id = 1;

这可能吗?怎么样?

2 个答案:

答案 0 :(得分:1)

您是否有理由不想加载完整的对象?除极少数情况外,没有真正的性能差异。

我可以理解不想将密码加载到内存中,尽管它应该加密,并且可能不应该在您的域模型中。在我的情况下,我会做的是将User子类分为两个类,User和UserProfile(包含密码等),这样您在管理用户帐户时只能使用UserProfile对象。

答案 1 :(得分:0)

您需要使用resultTransformer将查询结果映射到您要存储它的对象(我理解的是您的普通用户DTO类,但是减去所有其他字段)

请查看http://docs.jboss.org/hibernate/stable/core/reference/en/html/querysql.html(其Hibernate,而不是NHibernate,但它仍应适用),具体见16.1.5节