NHibernate N + 1 выберите: архитектурное решение? - PullRequest
1 голос
/ 22 марта 2009

Учитывая следующую «базу данных»:

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 ]

1 голос
/ 22 марта 2009

В общем, есть несколько способов избавиться от проблемы Select N + 1. В NHibernate один из моих любимых способов сделать это - использовать API Criteria, который очень разумный и продуманный.

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.

Чтобы узнать больше об этой и других стратегиях, я рекомендую посмотреть этот интересный пост в блоге .

0 голосов
/ 23 марта 2009

Одна вещь, которую вы могли бы сделать, - это иметь стратегию выборки для каждого сценария, в котором вам нужно получить данные. Это сообщение в блоге объясняет возможное решение для этого типа проблемы, автор использует свою собственную версию IRepository, но вы используете те же идеи в своем хранилище (или посмотрите его проект NCommon , чтобы черпать вдохновение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...