流利的NHibernate懒散问题

流利的NHibernate懒散问题,nhibernate,lazy-loading,Nhibernate,Lazy Loading,我找不到这个问题的答案,所以我认为这是我做错了什么 我设置了一个PersistenceModel,其中我设置了一个约定,如下所示:- persistenceModel.Conventions.Add(DefaultLazy.Always()); HasManyToMany(x => x.Affiliates).Not.LazyLoad(); 但是,对于我的一个实体中的一个HasManyToMany关系,我希望进行如下设置:- persistenceModel.Conventions.A

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

我设置了一个PersistenceModel,其中我设置了一个约定,如下所示:-

persistenceModel.Conventions.Add(DefaultLazy.Always());
HasManyToMany(x => x.Affiliates).Not.LazyLoad();
但是,对于我的一个实体中的一个HasManyToMany关系,我希望进行如下设置:-

persistenceModel.Conventions.Add(DefaultLazy.Always());
HasManyToMany(x => x.Affiliates).Not.LazyLoad();
直观地说,我希望在覆盖我指定为约定的延迟加载默认值时,能够进行快速加载,但它仍然是延迟加载。如果我将DefaultLazy约定设置为never,然后在单个关系上设置LazyLoad,那么它也不起作用

有什么想法吗?

当您设置Not.LazyLoad()时,您会告诉NHibernate在父节点加载时加载附属节点。NHibernate将通过在Affliates多对多表上执行另一个选择来实现这一点,而不管您是否访问附属机构集合。NHibernate正在使用另一个select,因为这是默认的获取模式。您还需要在查询或映射中覆盖抓取模式。要在映射中执行此操作,请添加以下内容:

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

如果希望NHibernate保留添加到集合中的新附属项并删除孤立项,则可能还需要包含“.Cascade.AllDeleteOrphan()”。如果不这样做,则必须显式调用session.Save(newAffiliate)。否则,当您的附属机构集合包含新附属机构时,您将收到TransientObject异常。

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

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

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

对不起,我删除了我认为与此无关的部分代码。我也有.FetchType.Join(),关闭延迟加载仍然不起作用。我发现对我有效的关闭延迟加载的唯一方法是设置约定。我添加了DefaultLazy.Always()约定,并且在应用Fetch.Join()时,HasManyToMany()关系正确地进行了加载。你可以从GitHub这里获取我的示例:好吧,我在我的情况下几乎模仿了你的代码,但它仍然不起作用,所以我必须仔细看看。我使用.ShowSql()来确定查询是延迟运行还是急切运行,我认为这是正确的?您的示例项目似乎使用了XML映射