powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: генерация кастомного ID
12 сообщений из 37, страница 2 из 2
NHibernate: генерация кастомного ID
    #38078219
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
ну если - Можно сделать это через триггер, но это зло и некроссплатформенно
я тогда ретируюсь, и снимаю свои пожелания.))
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078294
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиМожно сделать это через триггер, но это зло и некроссплатформенно

Еще раз всматриваемся в задачу :)

МСУЯ хочу, например, такой ID: [ddMMyyyy][sequence_num][запрос_из_вебсервиса_получение_некоего_спецномера][случайный_символ_из_строки_АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЭЮЯ][текущее_время]

P.S. Думал, что предложишь еще вариант - не завязываться на ID, а использовать для этого другое поле. А это уже новая пища для холивара переопределения айдишников. А ты сдался...
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078346
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,
я и думал что автор имеет ввиду дополнительное поле, а он вишь хочет упихнуть все в одно.
А что, в принципе - Можно сделать это через триггер, но это зло и некроссплатформенно,
это жесткий аргумент, и в прочем я с ним на сто процентов согласен, тут получается что кастомная генерация.
я то вообще на сервере решил исполнить что то в таком виде id= хешбазы |хештаблцы| хешguidзаписи
а потом and_ом проверять что за база, что за таблица,
В прочем мог бы быть еще вариант - служебная таблица, с индексаторами всех записей базы аки лонг, но она бы не смотрелась
в контексте всех хранилищ, а так я за кросплатформенность однозначно, поэтому и слинял ))
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078353
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще то тут бы гуиды смотрелись ваще великолепно, ибо они глобальны для всех галактик
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078381
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то щас подумал о другом поле, в принципе,( отрываясь от желания та) не плохая мысль, еще его вынести из сущности
что бы не мешалось под ногами, в виде явного интерфейса, или суб класса.
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078433
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче говоря, я почти дошел до того, что хотел.
Вот код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class MyGenerator : IIdentifierGenerator
    {
        // TODO вынести из хард кода:
        private const int OrgId = 219;

        protected string TableName;

        public object Generate(ISessionImplementor session, object obj)
        {
            var connection = session.Connection;

            long seqNextValue = 0;

            ConnectionState originalState = connection.State;
            if (originalState != ConnectionState.Open)
                connection.Open();
            try
            {
                IDbCommand command = connection.CreateCommand();
                //TODO заполнять как-то TableName и строку сделать такой: "select nextval('{0}_id_seq')"
                command.CommandText = string.Format("select nextval('role_id_seq')", TableName);
                seqNextValue = (long)command.ExecuteScalar();
            }
            finally
            {
                // Close the connection if that's how we got it
                if (originalState == ConnectionState.Closed)
                    connection.Close();
            }
            return seqNextValue * 1000 + OrgId;
        }
    }

    public abstract class BaseMap<T> : ClassMap<T>
        where T : DataAccess.Entity.BaseEntity
    {
        protected string tableName;

        protected BaseMap()
        {
            Id(x => x.Id).GeneratedBy.Custom <MyGenerator>();
.....



Единственное, МСУ, а как передать в генератор параметр? Я хочу имя таблицы передавать, чтобы для каждой таблицы использовался свой сиквенс. Вот в методе Generate есть какой-то object obj. Наверное, не просто так он там. Я погуглил опять же - не нашел ниче:( Подскажешь, может быть? На Fluent...
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078440
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиЧто то щас подумал о другом поле, в принципе,( отрываясь от желания та) не плохая мысль, еще его вынести из сущности
что бы не мешалось под ногами, в виде явного интерфейса, или суб класса.
а передачу оформить в виде
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
 sataic  void  SaveOrUpdateCore(this ISession ses, object ob)
      {
          if (ob is IIdentityGlobal)
          {
              ((IIdentityGlobal) ob).//че то делаем
                 
          } 
          ses.SaveOrUpdate(ob);
      }
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078499
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexvmk

http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/id/IdentifierGenerator.html#generate(org.hibernate.engine.SessionImplementor, java.lang.Object) Parameters:
object - the entity or toplevel collection for which the id is being generated
Returns:
a new identifier
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078617
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, поздравите меня! ) Я наконец-то закончил с этой задачей!
Решил не плодить последовательностей (sequences). Сделал один, на все таблицы. Его уж хватит, он длиной до 19-ти цифр. Единстевнный минус ID записей будет большой плодиться. Но ничег острашного.

Итоговый код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
/// <summary>
    /// NHibernate генератор ID
    /// </summary>
    public class MyGenerator : IIdentifierGenerator
    {
        /// <summary>
        /// Id орагнизации из БД
        /// </summary>
        private long _orgId;
        /// <summary>
        /// Следующее значение последовательности из БД
        /// </summary>
        private long _seqNextValue;

        /// <summary>
        /// Генерируем id для вставки записи в таблицу. 
        /// Запросы написаны для PostgreSQL. 
        /// Для другой СУБД нужно писать развилки.
        /// </summary>
        /// <param name="session"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public object Generate(ISessionImplementor session, object obj)
        {
            var connection = session.Connection;

            ConnectionState originalState = connection.State;
            if (originalState != ConnectionState.Open)
                connection.Open();
            try
            {
                IDbCommand command = connection.CreateCommand();
                command.CommandText = string.Format("select nextval('HIBERNATE_SEQUENCE')");
                _seqNextValue = (long)command.ExecuteScalar();

                command.CommandText = string.Format("select CAST(value AS bigint) from setting set WHERE upper(set.name) = upper('org_id')");
                _orgId = (long)command.ExecuteScalar();
            }
            finally
            {
                // Close the connection if that's how we got it
                if (originalState == ConnectionState.Closed)
                    connection.Close();
            }
            return _seqNextValue * 1000 + _orgId;
        }
    }

    public abstract class BaseMap<T> : ClassMap<T>
        where T : DataAccess.Entity.BaseEntity
    {
        protected string TableName;

        protected BaseMap()
        {
            Id(x => x.Id).GeneratedBy.Custom<MyGenerator>();
......



Спасибо большое всем, кто отозвался и помог! Особенно МСУ.

P.S.
Почему с сайта SQL.ru так быстро выкидывает, и приходиться заново аутентифицироваться!??! Тут уж не банк-онлайн же! Зачем такая защита!?
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38078648
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexvmkВсем привет!
Есть следующая задачка.
Есть распределенная POSTGRESQL БД. То есть есть ЦБД и множество БД. Все они имеют одинаковую структуру и данные в них синхронизируются.
Соответственно встала задача уникальности каждой записи в таблице в рамках всей распределенной БД.

Программа, которая работает с базами данных написана на C# и использует Fluent NHibernate. То есть все общение с данными через NHibernate происходит.

Так вот задачу уникальности я решил делать так:
у каждой БД есть номер org_id. Также для таблиц есть сиквенс. Генерим ID с помощью сиквенса, а далее вычисляем окончательное значение ID, как ID * 1000 + org_id. Все это генерим в Before Insert триггерах к таблицам.

...

Мда, мозг сломать можно, это все делается либо через гуид, либо составной идентификатор (ид-записи, ид-базы)
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38105252
Alexvmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гуиды не люблю. а я и делаю составной идентификатор.
Давайте, предлагайте свое решение.
...
Рейтинг: 0 / 0
NHibernate: генерация кастомного ID
    #38110059
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexvmkГуиды не люблю. а я и делаю составной идентификатор.
Давайте, предлагайте свое решение.
таки составной идентификатор УЖЕ уникальный:
Код: c#
1.
(ид записи = 1 / ид базы = 1) != (ид записи 1 / ид базы = 2)



при этом в Fluent NHibernate надо:
1. замаппить как CompositeId, указав две колонки
2. переопределить Equals() и GetHashCode() для класса сущности, GetHashCode можно например так:
Код: c#
1.
String.Format("{0}|{1}", Id, DataBaseId).GetHashCode()
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate: генерация кастомного ID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]