在NHibernate中,是否可以让查询返回一个部分填充数据的映射对象(其余部分是延迟加载的)?

时间:2011-08-11 00:24:56

标签: nhibernate

在我的旧数据库中,有一个包含40多列的巨型表。我希望能够用数据部分填充我的巨型映射类,所以我只得到我需要的数据。如何查询nhibernate以返回我的巨型映射对象,该对象只包含我想填写的属性?

更好的是:如果我确实需要另一个未填写的属性......它会被懒惰地加载。

这可能吗?

谢谢!

艾萨克

3 个答案:

答案 0 :(得分:1)

您最好的选择是在查询中投影各个属性。据我所知,NHibernate不允许你懒惰加载各个属性。

答案 1 :(得分:1)

是的,这是可能的。

http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties

字节码操纵器可以非常强大。根据这篇文章,只有Castle one支持它,但已经过了一年。我会 Li现在支持它。

即使这样也行不通。将每个属性转换为自己的映射类应该是相当直接的,其中延迟加载器将起作用。它并不理想,但如果它还没有支持懒惰属性,它将是一个解决方案。幸运的是,它似乎是NHibernate。

答案 2 :(得分:1)

这可以使用Fluent NHibernate,所以我假设它与NHibernate一起使用。这段代码适用于FNH(我很抱歉,但我不知道NHibernate的等价物,但如果你知道HBM文件,你应该可以解决它。)

您有两种方法可以执行此操作,默认情况下将所有方法加载为惰性,然后指定要单独完全加载的属性,或者默认情况下加载所有属性的相反方法,并指定要添加的属性懒惰。

第一个选项的示例映射(在FNH中,再次,抱歉)将是这样的:

public partial class ActionableEventMap : SubclassMap<ActionableEvent>
{
    public ActionableEventMap()
    {
        References(x => x.Branch).Access.Property();
        References(x => x.Department).Access.Property();
        Map(x => x.Cost).Not.LazyLoad().Access.Property();
        Map(x => x.PurchaseOrderNumber).Not.LazyLoad().Access.Property();
        References(x => x.UserQualification).Access.Property();
    }
}

请注意如何单独指定lazy属性

编辑:实际上,这是hbm

<property access="property" name="LastReminder" type="System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" lazy="false">
  <column name="LastReminder" />
</property>
<property access="property" name="CCEmailString" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" lazy="false">
  <column name="CCEmailString" />
</property>