我正在使用NHibernate,我想手动控制获取相关实体。
这是我的示例实体
public class Post
{
public virtual long Id { get; set; }
public virtual string Title { get; set; }
public virtual User User { get; set; }
public virtual IList<Like> Likes { get; set; }
public virtual IList<Tag> Tags { get; set; }
}
我期待的是如下:
session.Query<Post>().ToList();
在这种查询之后,我希望Post
个实体拥有:
User
属性不为null,但只设置了Id属性。Likes
和Tags
为空或空集合-
session.Query<Post>()
.Fetch(p => p.User)
.Fetch(p => p.Tags)
.ToList();
在这种查询之后,我希望Post
个实体拥有:
User
属性不为null且已设置属性。Tags
不为空且所有项目都设置了所有属性Likes
为空或空集合基本上我想从NHibernate得到的是,除非我要求它获取并且在我尝试访问未获取的属性时不引起NHibernate特定异常(LazyInitialization等),否则不要获取任何相关实体。我期望的行为不是懒惰也不是渴望。
之前&#34;你尝试了什么&#34;评论,我在Fluent NHibernate映射配置以及无状态和有状态会话中尝试了与LazyLoad()
,Not
,Fetch
等几乎所有组合。
答案 0 :(得分:1)
在调用引用之前,我无法弄清楚如何在没有验证的情况下处理未初始化的实例:
NHibernateUtil.IsInitialized(entityOrCollection)
和/或
NHibernateUtil.IsPropertyInitialized(obj, "propertyName")
答案 1 :(得分:0)
一个选项是在加载集合后立即将其他集合设置为空,
var list = session.Query<Post>()
.Fetch(p => p.User)
.Fetch(p => p.Tags)
.ToList();
list.ForEach(i => i.Likes = null);
但你不应该坚持他们(因为你使用无状态会话我不相信你打算坚持他们)。