验证NHibernate是否延迟加载了多对一属性

hen*_*sen 1 nhibernate lazy-loading nhibernate-mapping

我有一个项目和一个人(有点简化):

public class Project
{
    public virtual Person CreatedBy { get; set; }
}

public class Person
{
    public virtual string Username { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在与NH Linq合作一个项目:

var projects = from p in session.Query<Project>()
             select p;
var project = projects.First();
Run Code Online (Sandbox Code Playgroud)

有时使用Fetch()

var project = projects.Fetch(p => p.CreatedBy).First();
Run Code Online (Sandbox Code Playgroud)

现在,我怎样才能在一个单元测试验证project.CreatedBy 不是急切装载(和反向),这取决于如果取(),使用?在我的理解中,使用Fetch()应该急切加载Person,如果我不使用Fetch(),它应该延迟加载Person.

我试过了

Assert.IsTrue(NHibernateUtil.IsInitialized(project.CreatedBy));
Run Code Online (Sandbox Code Playgroud)

NHibernateUtil.IsPropertyInitialized(project, "CreatedBy")
Run Code Online (Sandbox Code Playgroud)

但是无论我是否使用Fetch(),它们都返回true.IsInitialized()适用于集合(一对多),例如Person.Projects,但不适用于多对一...

CreatedBy属性应该是延迟加载的,但有时我希望它被急切加载,我希望单元测试确认它正在按预期工作.

CreatedBy属性的映射是

<many-to-one name="CreatedBy" class="Person" fetch="select">
  <column name="PERSON_ID" precision="10" scale="0" not-null="true" />
</many-to-one>
Run Code Online (Sandbox Code Playgroud)

我验证了这样的映射:

var to1 = NHibernateConfiguration.GetClassMapping(typeof(Project))
    .ReferenceablePropertyIterator.FirstOrDefault(p => p.Name == "CreatedBy")
    .Value as NHibernate.Mapping.ToOne;

Assert.IsTrue(to1.IsLazy);
Assert.IsFalse(to1.UnwrapProxy);
Run Code Online (Sandbox Code Playgroud)

哪个通过.

有任何想法吗?

Die*_*hon 5

如果NHibernateUtil.IsInitialized(project.CreatedBy)返回true,那是因为它已初始化.

如果已经在会话中加载了Person,则无论您是否急切地获取CreatedBy,它都将被初始化,这要归功于Identity Map.