Интеллектуальная предварительная выборка Nhibernate в 1-м сценарии - PullRequest
0 голосов
/ 16 февраля 2012

Мы используем NHibernate 3.2 с плавными сопоставлениями. Ниже приведено простое сопоставление 1 к Многим в масштабируемой системе с высокой степенью масштабирования

    public class Root
    {
        public Root()
        {
            Childs = new List<Child>();
        }
        public virtual int ID { get; set; }
        public virtual IList<Child> Childs { get; set; }
        public virtual int LastChildID { get; set; }
        public virtual int CurrentChildID { get; set; }
    }

    public class Child
    {
        public virtual int ID { get; set; }
        public virtual Root Root { get; set; }
        public virtual string Name { get; set; }
    }

Когда мы загружаем это из репозитория почти во всех случаях, нас интересует только текущий дочерний элемент, как определено CurrentChildID, и мы хотим прочитать это одним попаданием из базы данных вместе с корнем, но без других дочерних записей. Если нас затем интересуют оставшиеся дочерние элементы, нам нужно только загрузить записи между LastChildID и CurrentChildID - причина этого в том, что у нас могут быть сотни дочерних элементов для корня, и все до того, как LastChildID будет помечен для архивирования / обработки данных, который обрабатывается отдельно.

Как настроить предварительную выборку в NHibernate. Мы просто не можем найти пример.

1 Ответ

0 голосов
/ 16 февраля 2012

Я бы изменил класс и реализовал методы getter и setter, чтобы сделать их согласованными, добавляя и удаляя из всех трех свойств

public class Root
{
    public Root()
    {
        Childs = new List<Child>();
        LastChilds = new List<Child>();
    }

    public virtual int ID { get; set; }
    public virtual IList<Child> AllChilds { get; private set; }
    public virtual IList<Child> ActiveChilds { get; private set; }
    public virtual Child CurrentChild { get; set; }
}

тогда

public class RootMap : ClassMap<Root>
{
    public RootMap()
    {

        HasMany(r => r.AllChilds);

        HasMany(r => r.ActiveChilds)
            .Where("archived = false"); // the childs know if they are archived otherwise it will get more complex

        References(r => r.CurrentChild, "LastChildID")
            .Not.LazyLoad();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...