NHibernate手动控制抓取

时间:2015-04-23 14:20:16

标签: c# nhibernate fluent-nhibernate fetch

我正在使用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个实体拥有:

  1. 设置原始属性
  2. User属性不为null,但只设置了Id属性。
  3. LikesTags为空或空集合
  4. -

    session.Query<Post>()
        .Fetch(p => p.User)
        .Fetch(p => p.Tags)
        .ToList();
    

    在这种查询之后,我希望Post个实体拥有:

    1. 设置原始属性
    2. User属性不为null且已设置属性。
    3. Tags不为空且所有项目都设置了所有属性
    4. Likes为空或空集合
    5. 基本上我想从NHibernate得到的是,除非我要求它获取并且在我尝试访问未获取的属性时不引起NHibernate特定异常(LazyInitialization等),否则不要获取任何相关实体。我期望的行为不是懒惰也不是渴望。

      之前&#34;你尝试了什么&#34;评论,我在Fluent NHibernate映射配置以及无状态和有状态会话中尝试了与LazyLoad()NotFetch等几乎所有组合。

2 个答案:

答案 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);

但你不应该坚持他们(因为你使用无状态会话我不相信你打算坚持他们)。