我被認爲是NHibernate的新手。我希望我的Article實體類有兩個懶惰屬性。其中之一是用戶其他是內容。我的實體和映射像NHibernate Linq Provider渴望獲取懶字符串屬性
<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(ISession session = sessionFactory.OpenSession()) {
return session.Query<Article>()
.Fetch(a => a.User)
.SingleOrDefault(a => a.Id == id);
}
它仍然正常工作。當我嘗試訪問使用塊之外的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的解決方案供應商。
有沒有什麼可以提取內容數據的熱切?可能是EF中的一些包含方法。如果沒有,我們可以說懶惰的標量屬性不能使用linq提供程序獲取嗎? –
@MehmetAtaş不是我知道 - 顯然,如果您訪問您的使用語句中的內容屬性它將被加載,但這仍然是加載後,因爲它不會被填充爲您的初始查詢的一部分。你爲什麼要這個特定的屬性後裝? – CSL
@MehmetAtaşEF包含方法的功能與nHibernate中的Fetch相同 – CSL