我在关系的一边有以下映射覆盖:
public void Override(AutoMapping<ItemAsmtDetailDh> mapping) { mapping.HasMany<WAsmtDetail>(x => x.WAsmtDetails).Inverse().AsBag().Cascade.AllDeleteOrphan().Access.PascalCaseField(Prefix.Underscore).Not.LazyLoad().Fetch.Join(); }
在我的关系的另一边:
public void Override(AutoMapping<WAsmtDetail> mapping) { mapping.References<ItemAsmtDetailDh>(x => x.ItemAsmtDetailDh).Not.Nullable().Not.LazyLoad().Fetch.Join(); }
当我使用Showsql选项时,我看到它仍然为WAsmtDetails发出单独的select语句,给我可怕的“n 1选择”问题.为什么“.Not.LazyLoad().Fetch.Join()”被忽略?
注意:我使用Fluent NHibernate版本1.1,而不是版本2.1,因为较新版本的错误. (查看我的答案this question的错误详细信息.)我使用NHibernate版本2.1.2.4000.
解决方法
您最有可能以映射(如HQL或Linq)中的Fetch.Join()不受影响的方式加载数据.从NHibernate文档:
The fetch strategy defined in the mapping document affects:
- retrieval via Get() or Load()
- retrieval that happens implicitly when an association is navigated
- ICriteria queries
- HQL queries if subselect fetching is used