|
|
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Есть табличка у нее PK int не idenity. При сохранении записи добавленной в приложении, при помощи SaveChanges() необходимо генерить новый код, типа: Код: plaintext Неохота процедуру инсерта писать, ибо там полей около сотни. Может есть какое-нибудь решение более или менее красивое ? ))) (Поле тоже нельзя сделать identity на серваке.) Спасибо. VS2008, MS SQL2008, EF 3.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:07 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Почитай про HiLo Identity Generator в NHibernate -- глядишь, чего-нибудь подобное для EF сочинишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:10 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Изначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему). Если устроит накладывать лок на таблицу - вперёд на амбразуру. А за такое Код: plaintext расстреливать на месте нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:20 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУИзначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему). Если устроит накладывать лок на таблицу - вперёд на амбразуру. А за такое Код: plaintext расстреливать на месте нужно. Почему клиенту нельзя генерить PK, догадался. На клиенте SQL-ный генерится скрипт, в котором определяется новый код и собственно сам апдейт. Пример: Код: plaintext 1. 2. Лок как-то неохота делать в транзакции открываемой программно на клиенте. Если конечно только его нельзя встраивать в генерируемый запрос. )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:30 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУИзначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему). Клиент в принципе имеет полное право генерировать PK -- тоже почитай про HiLo. И про то, что SCOPE_IDENTITY сломан . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:35 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
НахлобучКлиент в принципе имеет полное право генерировать PK Клиент в принципе не имеет полное право генерировать PK. Исключение составляет гуид, который обеспечивает должную уникальность. Нахлобуч SCOPE_IDENTITY сломан . Причём тут SCOPE_IDENTITY и генерация PK средствами SQL сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:44 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУКлиент в принципе не имеет полное право генерировать PK. Исключение составляет гуид, который обеспечивает должную уникальность.Про HiLo прочитал уже? МСУПричём тут SCOPE_IDENTITY и генерация PK средствами SQL сервера?Ну кагбэ если тебе SQL Server сгенерирует PK с помощью наиболее широко используемого автоинкремента (Identity), а ты его не сможешь правильно получить -- догадываешься, что потом получится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:47 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
НахлобучПро HiLo прочитал уже? Изучили уже трассу SQL кода, которую он генерит? НахлобучНу кагбэ если тебе SQL Server сгенерирует PK с помощью наиболее широко используемого автоинкремента (Identity), а ты его не сможешь правильно получить -- догадываешься, что потом получится? Юзать output inserted ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:52 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУИзучили уже трассу SQL кода, которую он генерит?Слив? Какую трассу, о чем речь вообще? Я задал вопрос, на который можно ответить либо "да", либо "нет". МСУЮзать output insertedС тебя патч для EF, который это будет делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 17:56 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
НахлобучСлив? Куда? НахлобучКакую трассу, о чем речь вообще? О трассировке. Дать определение, что-ли? НахлобучЯ задал вопрос, на который можно ответить либо "да", либо "нет". Нет. НахлобучС тебя патч для EF, который это будет делать. Срочно в EF читать про SP Mapping Insert Function. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 18:02 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУ Срочно в EF читать про SP Mapping Insert Function. Это то понятно ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 18:05 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУО трассировке. Дать определение, что-ли?Мда. Он генерирует ровно два стейтмента, после чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило? МСУСрочно в EF читать про SP Mapping Insert Function.Замахаешься мапить и плодить говнокод банальных CUD-хранимок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 18:09 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Нахлобучпосле чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило? Сгенерили. Конкуренты тоже сгенерили. Дальше что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 18:15 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУСгенерили. Конкуренты тоже сгенерили. Дальше что? На, читай : High-low strategyThe basic idea is that your key value, often called a persistent object identifier (POID) or simply an object identified (OID), is in two logical parts: A unique HIGH value that you obtain from a defined source and an N-digit LOW value that your application assigns itself. Each time that a HIGH value is obtained the LOW value will be set to zero. For example, if the application that you’re running requests a value for HIGH it will be assigned the value 1701. Assuming that N, the number of digits for LOW, is four then all persistent object identifiers that the application assigns to objects will be combination of 17010000,17010001, 17010002, and so on until 17019999. At this point a new value for HIGH is obtained, LOW is reset to zero, and you continue again. If another application requests a value for HIGH immediately after you it will given the value of 1702, and the OIDs that will be assigned to objects that it creates will be 17020000, 17020001, and so on. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.07.2010, 18:21 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Это чё за фигня? Каким образом другое приложение должно узнать о number of digits for LOW ? Само догадаться? Во-вторых, это не гарантирует вставку такого же значения другим приложением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 09:05 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Нахлобуч И еще. Сами-то пробовали репродюсировать сломанность скоупидентити? Отвечать: да или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 13:22 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУЭто чё за фигня? Каким образом другое приложение должно узнать о number of digits for LOW ? Само догадаться?Прочитает из базы данных. МСУВо-вторых, это не гарантирует вставку такого же значения другим приложением.Ну ты по ссылке-то сходил или как? Гарантирует. МСУИ еще. Сами-то пробовали репродюсировать сломанность скоупидентити? Отвечать: да или нет.На предыдущем месте работы сами столкнулись с таким. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 13:59 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
НахлобучПрочитает из базы данных. Атец, срочно читать организацию ACID, конекретно про Isolation (изолированность). Любое обновление определенной транзакции будет скрыто от остальных до тех пор, пока эта транзакция не будет зафиксирована . Выход из сложившейся ситуации - блокировка. Ресурс должен быть успешно захвачен для изоляции. А теперь включите моск и подумайте, надежен ли предлагаемый лисапет клиентских айди? Ответ - нет и только нет. Тем более гавноHiLo не лочит ресурс, следовательно, надежность такой конструкции - ноль. До сих пор не втумкали, о чём я вещаю? НахлобучНу ты по ссылке-то сходил или как? Гарантирует. Читать долго и упорно про изоляцию. Так же не забыть подкрепить знания про атомарности батча. НахлобучНа предыдущем месте работы сами столкнулись с таким. Сказочник Вы однако. Весь мир юзает скоуп идентити и тут появляетесь Вы и рвете правду матку. Слабо еще разок спровоцировать описанное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:10 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Нахлобуч Специально по заявкам на пальцах: пример блокировки записи REPEATABLE READ Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Обратить внимание на закоментаренный COMMIT. Итак, что это значит? Это значит, что инструкции не могут считывать данные, которые были изменены (если выполняются манипуляции, как у меня в примере UPDATE), но еще не зафиксированы другими транзакциями (как-раз таки закоменченный COMMIT), а также на то, что другие транзакции не могут изменять данные, читаемые текущей транзакцией, до ее завершения . Но! Другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции. При повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведет к считыванию фантома. В данном случае действуем по ситуации: либо меняем логику либо выбираем другой уровень изоляции. P.S. Атец, поэтому я в начале и спросил про: МСУИзучили уже трассу SQL кода, которую он генерит? ... на что увидел одни недоумения и ужас от таких слов. и после этого, Вы, наконец, родили: НахлобучМСУО трассировке. Дать определение, что-ли?Мда. Он генерирует ровно два стейтмента, после чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило? Еще раз поясняю, что эти гавнохиловские два стейтмента идут в печку, ибо нет изоляции. Выводы напрашиваются сами собой. P.S2. В закреплении материала: клиент может генерить уникальные идентификаторы? (гуидов не касается) P.S3. По поводу гуидов. Никто не запрещает отправить с клиента гуид уже существующий в таблице. Следовательно, невозможность вставки и прочие ошибки. Это так, к размышлению. P.S4. Генерацией уникального идентификатора должен заниматься сервер и только он (ну можно еще сделать искючение для uniqueidentifier полей, ладно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:43 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Я, конечно, догадываюсь, что автор может хотеть организацию непрерывной последовательности (возможно даже с пересчётом). Это типа как генерация номера счет-фактуры (без пересчета, конечно) и иже. Но, это решается не "PK int не idenity (с)", а отдельным полем. И никакие хило и прочий ширпотреб тут не нужен. Алгоритмы не раз обсуждались на форуме MS SQL - поиск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:48 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУАтец, срочно читать организацию ACID, конекретно про Isolation (изолированность). Любое обновление определенной транзакции будет скрыто от остальных до тех пор, пока эта транзакция не будет зафиксирована . Выход из сложившейся ситуации - блокировка. Ресурс должен быть успешно захвачен для изоляции. А теперь включите моск и подумайте, надежен ли предлагаемый лисапет клиентских айди? Ответ - нет и только нет. Тем более гавноHiLo не лочит ресурс, следовательно, надежность такой конструкции - ноль. До сих пор не втумкали, о чём я вещаю? Внимательно следи за пальцами, если читать не хочешь. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Клиент теперь может совершенно безопасно генерировать 1000 идентификаторов. За новой порцией -- то есть, за новым hi -- он еще раз сходит на сервер и получит его в отдельной транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 14:52 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
Нахлобуч Я, видимо, в пустую тут трезвонил про атомарности, про изоляцию. Не вижу тут изоляцию батча записи сгенеренного ID. Никак не допрёте, что транзакция должна закрывать уже после вставки, а не после получения ID. Во-вторых. Вы издеваетесь? У меня миллион клиентов, теперь прикиньте, какие разрывы в int'e у меня будут? Тут даже bigint не спасет. Никогда не встречались с переполнением инта? У меня один раз на биллинговом проекте было такое. Это пипец просто. P.S. Еще раз: поюзайте форум MS SQL, там пробегали интересные алгоритмы реализации последовательностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 15:37 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУЯ, видимо, в пустую тут трезвонил про атомарности, про изоляцию. Не вижу тут изоляцию батча записи сгенеренного ID.Да я тоже, похоже, зря бисер мечу. Расскажи, что тут мне изолировать, если у каждого клиента уникальный hi, на основе которого он генерирует уникальные в пределах всей БД идентификаторы? Если у меня hi == 12 и lo = 1000, то идентификаторы [12000, 12999] -- точно уникальные, таких уже никто не получит. МСУНикак не допрёте, что транзакция должна закрывать уже после вставки, а не после получения ID.Да на вставку можешь её хоть не открывать -- все равно конфликтов идентификаторов не будет. МСУВо-вторых. Вы издеваетесь? У меня миллион клиентов, теперь прикиньте, какие разрывы в int'e у меня будут? Тут даже bigint не спасет. Никогда не встречались с переполнением инта? У меня один раз на биллинговом проекте было такое. Это пипец просто.Ну давай считать. Максимальное число, влезающее в bigint -- это 9223372036854775807. Предположим, клиенты вставляют по миллиону записей в секунду. Допустим, к тому же, что из батча в 1000 идентификаторов мы используем только один, а потом запрашиваем новый hi. Делим-умножаем и выясняем, что идентификаторов хватит почти на три столетия. А если сократить значение lo до 100 -- то вообще на 2900 лет удовольствие растянется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 15:59 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
НахлобучРасскажи, что тут мне изолировать, если у каждого клиента уникальный hi, на основе которого он генерирует уникальные в пределах всей БД идентификаторы? Если у меня hi == 12 и lo = 1000, то идентификаторы [12000, 12999] -- точно уникальные, таких уже никто не получит. Изолировать нужно то, что попытается стиснуться мимо логики identity_info. НахлобучДа на вставку можешь её хоть не открывать -- все равно конфликтов идентификаторов не будет. Выше смотреть. НахлобучНу давай считать. Да, сейчас посчитаем. Считаете-то неправильно: клиент захватил себе 1000 значений. Использовал только одно значение и отвалился. Пришел другой клиент и захватил себе еще 1000 значений, заюзал только одно и отвалился. Смекаете, о чём я? По правильному: нужно привязать диапазон значений к клиентую Тогда bigint вполне устроит. Но я не вижу в хиберовой реализации привязки диапазона значений к клиенту. Ясно, а чём трактую или опять разжевать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 16:08 |
|
||
|
Entity Framework Автоинкремент на клиенте
|
|||
|---|---|---|---|
|
#18+
МСУИзолировать нужно то, что попытается стиснуться мимо логики identity_info.Ну начинается. Мой тезис был о том, что на клиенте идентификаторы генерировать таки можно, а я сам себе не злобный буратино, чтобы в обход строго определенного механизма это делать. Если кто-то по-другому себя ведет -- его личные трудности. МСУДа, сейчас посчитаем. Считаете-то неправильно: клиент захватил себе 1000 значений. Использовал только одно значение и отвалился. Пришел другой клиент и захватил себе еще 1000 значений, заюзал только одно и отвалился. Смекаете, о чём я?Ога. Ровно так я и считал; читай внимательнее. МСУПо правильному: нужно привязать диапазон значений к клиентую Тогда bigint вполне устроит. Но я не вижу в хиберовой реализации привязки диапазона значений к клиенту. Ясно, а чём трактую или опять разжевать?Ты куда вообще смотрел по поводу привязки к клиенту? Давай ссылку на "реализацию" -- файл, строка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2010, 16:25 |
|
||
|
|

start [/forum/topic.php?fid=17&fpage=55&tid=1351199]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 361ms |

| 0 / 0 |
