在nHibernate中更深入的提取返回一个代理对象

时间:2015-05-06 15:20:29

标签: c# nhibernate proxy

我有以下数据模型,我试图使用nHibernate获取。

作者 - >作者列表 - >预订

AuthorBook基本上是一个联结表,允许在Author和Book之间进行多对多的映射。

基本上,我试图提出允许我的查询(使用一个会话) 拉出作者和与作者关联的书籍列表。

这是我到目前为止所尝试的内容。

var author = session.QueryOver<Author>.Where(x => x.Id = AuthorId) 
                                      .Fetch(x => x.SomeList).Eager
                                      .Fetch(x => x.AuthorBooks).Eager
                                      .FutureValue();

该查询将正确返回作者书籍列表,但列表中的实体是代理项目(代理作者和代理书籍)。所以我决定在同一个会话中再做一次。

var authorBooks = session.QueryOver<AuthorBook>()
                         .JoinQueryOver(x => x.Author)
                         .Where(x => x.Id = AuthorId) 
                         .Fetch(x => x.Book).Eager
                         .Fetch(x => x.Author).Eager
                         .Future();

然后,我只是将AuthorBooks的结果设置为主父对象...

var actualAuthor = author.Value; //from the previous query
actualAuthor.AuthorBooks = new HashSet<AuthorBook>(authorBooks.ToList());

但是这没有做到这一点,它仍然告诉我,AuthorBooks中的记录是代理对象......对我缺少什么的任何想法?

1 个答案:

答案 0 :(得分:1)

这样的事情应该一次性获取所有数据:

        AuthorBook authorBooks = null;
        Book book = null;

        session.QueryOver<Author>()
            .Where(x => x.Id = AuthorId)
            .JoinAlias(a => a.AuthorBooks, () => authorBooks,JoinType.LeftOuterJoin)
            .JoinAlias(() => authorBooks.Book, () => book)
            .SingleOrDefault();