Можете ли вы объяснить, что делают аргументы GeneratedBy.HiLo (...)? - PullRequest
2 голосов
/ 18 августа 2011

Есть несколько перегрузок:

GeneratedBy.HiLo(string maxLo);
GeneratedBy.HiLo(string maxLo, Action<ParamBuilder> paramValues);
GeneratedBy.HiLo(string table, string column, string maxLo);
GeneratedBy.HiLo(string table, string column, string maxLo, string where);
GeneratedBy.HiLo(string table, string column, string maxLo, Action<ParamBuilder> paramValues);

Я концептуально понимаю, что делает алгоритм hi / lo.Но что эти параметры делают ?Я не могу найти документацию в Hibernate о том, что они на самом деле делают.

Должно ли maxLo быть именем или числом?Каковы значения paramValues?Каковы цели table и column?

Пример использования на основе учебного пособия по началу работы с NHibernate:

public class StoreMap : ClassMap<Store>
{
    public StoreMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("something");
        Map(x => x.Name);
        HasMany(x => x.Staff)
            .Inverse()
            .Cascade.All();
        HasManyToMany(x => x.Products)
            .Cascade.All()
            .Table("StoreProduct");
    }
}

1 Ответ

7 голосов
/ 18 августа 2011

maxLo - это Lo-значение HiLo.

В зависимости от частоты вставок в таблицу, вы должны указать значение 10, 100 или 1000. Если вы укажете значение 10, NHibernateбудет брать значение Hi из базы данных и использовать низкое значение для генерации HiLo.

Если вы вставляете часто, вы должны указать высокий Lo (например, 100 или 1000), если вы вставляете реже, чем выследует указать низкий Lo.Это связано с тем, что новое значение Hi извлекается из базы данных каждый раз, когда создается фабрика сеанса.Если у вас текущий Hi 5 с Lo 100, и вы вставили 13 из 100 элементов, и вы создаете новую фабрику сессий (после перезапуска веб-сайта или приложения), то он получит новый Hi 6, и выбудет иметь промежутки от 513 до 600

Так что если ваш Hi в данный момент равен 3, то он будет генерировать значения от 31 до 40. Аналогично, если ваш Lo равен 1000, он будет генерировать значения от 3001 до 4000.

Дополнительные параметры позволяют указать таблицу, в которой хранится значение Hi.По умолчанию NHibernate сгенерирует эту таблицу для вас, если он настроен на создание / обновление базы данных, однако параметры позволяют вам самим настраивать таблицы.

Я недавно написал сообщение в блоге, в котором отображается число столбцов на Hi,и ряд за привет.

http://www.philliphaydon.com/2010/10/24/using-hilo-with-fluentnhibernate/

Редактировать: поведение Lo, такое как 7

HiLo рассчитывается как диапазон чисел, например, если мы имеемHi 3 и Lo 10, диапазон между:

3 * 10 = 30 до 3 * 10 + 10 = 40

Таким образом, фабрика сессий будет иметь диапазон от 30 до 40, когда вы запрашиваете Id для объекта, он захватывает его текущее значение (30) и добавляет 1. Таким образом, Id = 31. Следующий объект займет 31+1 = 32. И это происходит до тех пор, пока не достигнет 40, после чего он отправляется в базу данных и запрашивает следующий привет.

Если у вас было два веб-сервера, второй веб-сервер, возможно, запросил следующийПривет, который был 4, что означает, что первый веб-сервер получит 5.

Таким образом, ваш следующий диапазон составляет от 50 до 60.


Если Lo было 7, мы получили бы:

0 * 7 = 0 / 0 * 7 + 7 = 7 = 1-7

1 * 7 = 7 / 1 * 7 + 7 = 14 = 8-14

2 * 7 = 14 / 2 * 7 + 7 = 21 знак равно15-21

Так что все еще работает.

Но, по моему личному мнению, легче работать с целыми значениями, 10, 100, 1000.

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