私はNHibernateの初心者と見なされています。Article エンティティ クラスに 2 つの遅延プロパティを持たせたいと考えています。そのうちの 1 つはユーザーで、もう 1 つはコンテンツです。私のエンティティとマッピングは
<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 プロバイダーを使用したソリューションを探しています。