流畅的NHibernate LazyLoad问题

时间:2010-11-16 17:07:18

标签: nhibernate lazy-loading

我找不到这个问题的答案所以我认为这是我做错了。

我设置了PersistenceModel,我按如下方式设置了约定: -

persistenceModel.Conventions.Add(DefaultLazy.Always());

但是,对于我的一个实体中的一个HasManyToMany关系,我希望按照以下方式进行切换: -

HasManyToMany(x => x.Affiliates).Not.LazyLoad();

直观地说,我希望能够进行急切加载,因为我正在覆盖我已指定为约定的延迟加载默认值,但它仍然是延迟加载。如果我将DefaultLazy约定设置为never,然后在单个关系上设置LazyLoad,则它也不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

当您设置Not.LazyLoad()时,您告诉NHibernate在父加载时加载Affiliates。 NHibernate将通过在Affliates多对多表上执行另一个选择来执行此操作,无论您是否访问Affiliates集合。 NHibernate正在使用另一个选择,因为这是默认的提取模式。您也希望在查询或映射中覆盖提取模式。要在映射中执行此操作,请添加以下内容:

HasManyToMany(x => x.Affiliates)
    .Not.LazyLoad()
    .Fetch.Join();

如果您希望NHibernate持久保存添加到集合中的新Affiliaites并删除孤立的那些,您可能还想要包含“.Cascade.AllDeleteOrphan()”。如果不这样做,则必须显式调用session.Save(newAffiliate)。否则,当您的Affiliates集合包含新的关联企业时,您将收到TransientObjectException。

答案 1 :(得分:0)

这可能是一个愚蠢的问题,但您是否在会话中执行查询?说,

Using(var session = OpenSession())
{
    session.Query<Entity>().ToList();
}

之前我遇到过这个问题,最后意识到在处理会话之前没有查询我正在访问的对象。