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)
哪个通过.
有任何想法吗?
如果NHibernateUtil.IsInitialized(project.CreatedBy)
返回true,那是因为它已初始化.
如果已经在会话中加载了Person,则无论您是否急切地获取CreatedBy,它都将被初始化,这要归功于Identity Map.
归档时间: |
|
查看次数: |
2888 次 |
最近记录: |