【发布时间】:2011-02-01 22:58:28
【问题描述】:
我有一个项目和一个人(有些简化):
public class Project
{
public virtual Person CreatedBy { get; set; }
}
public class Person
{
public virtual string Username { get; set; }
}
我正在与 NH Linq 合作一个项目:
var projects = from p in session.Query<Project>()
select p;
var project = projects.First();
有时使用 Fetch()
var project = projects.Fetch(p => p.CreatedBy).First();
现在,我如何在单元测试中验证 project.CreatedBy 不是或 急切加载(反之亦然),具体取决于 Fetch() 是否用过的?据我了解,使用 Fetch() 应该预先加载 Person,如果我不使用 Fetch(),它应该延迟加载 Person。
我试过了
Assert.IsTrue(NHibernateUtil.IsInitialized(project.CreatedBy));
还有
NHibernateUtil.IsPropertyInitialized(project, "CreatedBy")
但无论我是否使用 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>
我验证了这样的映射:
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);
通过了。
有什么想法吗?
【问题讨论】:
标签: nhibernate nhibernate-mapping lazy-loading