我在MVC 4应用程序中使用 NHibernate / Fluent NHibernate 最新版本。我通过Nuget安装了Fluent NHibernate
,其版本为1.3.0.733
。 NHibernate的版本类似于3.3.x
PM>安装包FluentNHibernate
请注意,安装Fluent NHibernate
版本1.2.0.712时不会出现此问题。
PM>安装包FluentNHibernate -Version 1.2.0.712
我有这样的查询,
public IList<Post> Posts(int pageNo, int pageSize)
{
return _session.Query<Post>()
.Where(p => p.Published)
.OrderByDescending(p => p.PostedOn)
.Skip(pageNo * pageSize)
.Take(pageSize)
.Fetch(p => p.Category)
.FetchMany(p => p.Tags)
.ToList();
}
有三个类:Post
,Category
和Tag
。在数据库中,我有Post
的15条记录。当我将pageNo
传递为0并将pageSize
传递为10时,我从上述查询中只获得了7条记录。为什么呢?
以下是类及其对应的映射类。
发表
public class Post
{
public virtual int Id
{ get; set; }
public virtual bool Published
{ get; set; }
public virtual DateTime PostedOn
{ get; set; }
public virtual Category Category
{ get; set; }
public virtual IList<Tag> Tags
{ get; set; }
}
分类
public class Category
{
public virtual int Id
{ get; set; }
public virtual string Name
{ get; set; }
public virtual string Description
{ get; set; }
public virtual IList<Post> Posts
{ get; set; }
}
代码
public class Tag
{
public virtual int Id
{ get; set; }
public virtual string Name
{ get; set; }
public virtual string Description
{ get; set; }
public virtual IList<Post> Posts
{ get; set; }
}
PostMap
public class PostMap: ClassMap<Post>
{
public PostMap()
{
Id(x => x.Id);
Map(x => x.Published).Not.Nullable();
Map(x => x.PostedOn).Not.Nullable();
References(x => x.Category).Column("Category").Not.Nullable();
HasManyToMany(x => x.Tags).Cascade.All().Table("PostTagMap");
}
}
CategoryMap
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name).Length(50).Not.Nullable();
Map(x => x.Description).Length(200);
HasMany(x => x.Posts).Inverse().Cascade.All().KeyColumn("Category");
}
}
TagMap
public class TagMap: ClassMap<Tag>
{
public TagMap()
{
Id(x => x.Id);
Map(x => x.Name).Length(50).Not.Nullable();
Map(x => x.Description).Length(200);
HasManyToMany(x => x.Posts).Cascade.All().Inverse().Table("PostTagMap");
}
}
答案 0 :(得分:4)
请尝试检查此答案:https://stackoverflow.com/a/13894326/1679310
该问题很可能隐藏在Tag
集合的内联 Fetch 中。它将导致SELECT子句返回更多行,然后Post
计数。 Take()
和Skip()
已应用于此结果集...因此只返回前7个帖子,因为其中一些帖子有更多标签:
Post1 | TagA
Post2 | TagA
Post2 | TagB
..