分散问题与流利的nhibernate

时间:2012-12-17 04:39:50

标签: c# nhibernate fluent-nhibernate

我在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();
}

有三个类:PostCategoryTag。在数据库中,我有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");
    }
  }

1 个答案:

答案 0 :(得分:4)

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

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

  

Post1 | TagA
Post2 | TagA
Post2 | TagB
..