NHibernate N + 1选择:架构解决方案?

时间:2009-03-22 13:01:51

标签: nhibernate architecture

考虑以下“数据库”:

Post -> User

实体:

class User
{
    public virtual string Name { get; set; }
    public virtual IList<Post> Posts { get; set; }
}

class Post
{
    public virtual string Title { get; set; }
    public virtual User Author { get; set; }
}

以下服务层:

class UserService
{
    IRepositoryUsers repositoryUsers;

    IList<User> GetUsers()
    {
        return this.repositoryUsers.GetAllUsers();
    }
}

当我想要打印所有用户,并且有相关的帖子计数时,我得到(这并不奇怪)一个N + 1选择问题,对于每一行,它会创建一个选择来获取用户的帖子。

现在我的问题是:处理此问题的“最佳”方式是什么,因为在某些情况下我不想急切加载每个用户的帖子。

我应该在我的存储库(和服务)中创建尽可能多的方法来匹配这些场景吗?

2 个答案:

答案 0 :(得分:1)

一般来说,有几种方法可以消除选择N + 1问题。使用NHibernate,我最喜欢的方法之一是使用Criteria API,这是非常明智和深思熟虑的。

session.CreateCriteria(typeof(Fruit))            // Get me some fruit.
    .SetFetchMode("CitrusType", FetchMode.Eager) // Just get this one field.
    .Add(Expression.Eq("Basket", 47))            // Only fruit that are in this basket.
    .List();                                     // Get 'em all.

要详细了解此策略和其他策略,建议您查看此interesting blog post

答案 1 :(得分:0)

您可以做的一件事是为您需要检索数据的每个场景都有一个提取策略。 这个blog post解释了这种类型问题的可能解决方案,作者使用他自己的IRepository版本但你在你的知识库中使用相同的想法(或者查看他的NCommon项目以获得一些灵感)< / p>