在我的旧数据库中,有一个包含40多列的巨型表。我希望能够用数据部分填充我的巨型映射类,所以我只得到我需要的数据。如何查询nhibernate以返回我的巨型映射对象,该对象只包含我想填写的属性?
更好的是:如果我确实需要另一个未填写的属性......它会被懒惰地加载。
这可能吗?
谢谢!
艾萨克
答案 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>