我被认为是 NHibernate 的新手。我希望我的 Article 实体类有两个惰性属性。其中一个是用户,另一个是内容。我的实体和映射就像
<class name="Article" table="TBL_ARTICLE">
<id name="Id" column="ART_ID">
<generator class="native" />
</id>
<property name="UserId" column="USR_ID" not-null="true" />
<many-to-one name="User" column="USR_ID" insert="false" update="false" />
<property name="Content" column="ART_CONTENT" not-null="true" lazy="true" />
</class>
public class Article
{
public virtual long Id { get; set; }
public virtual long UserId { get; set; }
public virtual User User { get; set; }
public virtual string Content { get; set; }
}
我选择它喜欢
using(ISession session = sessionFactory.OpenSession()) {
return session.Query<Article>()
.SingleOrDefault(a => a.Id == id);
}
它工作正常。当我尝试访问 using 块之外的 User 或 Content 属性时,我得到了某种延迟加载异常。这是我所期待的。
在某些情况下,我喜欢急切地获取用户数据。我像这样选择它:
using(ISession session = sessionFactory.OpenSession()) {
return session.Query<Article>()
.Fetch(a => a.User)
.SingleOrDefault(a => a.Id == id);
}
它仍然可以正常工作。当我尝试访问 using 块之外的 User 属性时,我可以获得其属性值,但是当尝试访问 Content 属性时,我仍然会遇到某种延迟加载异常,这仍然是我所期望的。
当我想获取内容数据时
using(ISession session = sessionFactory.OpenSession()) {
return session.Query<Article>()
.Fetch(a => a.Content)
.SingleOrDefault(a => a.Id == id);
}
我得到一个例外:
Invalid join: a.Content
[.SingleOrDefault[Repository.NH.Article](.Fetch[Repository.NH.Article,System.String]
(NHibernate.Linq.NhQueryable`1[Repository.NH.Article], Quote((a, ) => (a.Content)), ),
Quote((a, ) => (Equal(a.Id, 1))), )]
我阅读了一些关于 HQL 执行此操作的博客文章,但我正在寻找使用 Linq Provider 的解决方案。