我有以下数据模型,我试图使用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中的记录是代理对象......对我缺少什么的任何想法?
答案 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();