3

我在 MVC 4 应用程序中使用NHibernate/Fluent NHibernate最新版本。Fluent NHibernate是通过 Nuget 安装的,它的版本是1.3.0.733. NHibernate 的版本类似于3.3.x

PM> Install-Package 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();
}

共有三个类PostCategoryTag。在数据库中,我有 15 条记录PostpageNo当我作为 0 和10传递时,pageSize我从上述查询中只得到 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; }
  }

邮政地图

  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");
    }
  }

类别地图

  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");
    }
  }

标记图

  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");
    }
  }
4

1 回答 1

4

请尝试检查这个答案:https ://stackoverflow.com/a/13894326/1679310

该问题很可能隐藏在集合的内联Fetch中。Tag它将导致 SELECT 子句返回比Post计数更多的行。并应用于此结果集...Take()因此Skip()仅返回前 7 个帖子,因为其中一些帖子具有更多标签:

帖子1 | TagA
Post2 | TagA
Post2 | 标签B
..

于 2012-12-17T07:13:16.370 回答