powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework Автоинкремент на клиенте
25 сообщений из 32, страница 1 из 2
Entity Framework Автоинкремент на клиенте
    #36726148
DenisVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Есть табличка у нее PK int не idenity.
При сохранении записи добавленной в приложении, при помощи SaveChanges() необходимо генерить новый код, типа:
Код: plaintext
select isnull(max(Kod),0)+1 from table1

Неохота процедуру инсерта писать, ибо там полей около сотни. Может есть какое-нибудь решение более или менее красивое ? )))
(Поле тоже нельзя сделать identity на серваке.)
Спасибо.
VS2008, MS SQL2008, EF 3.5
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726163
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай про HiLo Identity Generator в NHibernate -- глядишь, чего-нибудь подобное для EF сочинишь.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726189
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему). Если устроит накладывать лок на таблицу - вперёд на амбразуру.

А за такое

Код: plaintext
select isnull(max(Kod), 0 )+ 1  from table1

расстреливать на месте нужно.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726218
DenisVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУИзначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему). Если устроит накладывать лок на таблицу - вперёд на амбразуру.

А за такое

Код: plaintext
select isnull(max(Kod), 0 )+ 1  from table1

расстреливать на месте нужно.

Почему клиенту нельзя генерить PK, догадался.
На клиенте SQL-ный генерится скрипт, в котором определяется новый код и собственно сам апдейт.
Пример:
Код: plaintext
1.
2.
INSERT INTO Table1 (kod, value1)
SELECT
	(select isnull(max(Kod),0)+1 from Table1), 1
И никаких корреляций. Что вас не устраивает в таком апдейте ?

Лок как-то неохота делать в транзакции открываемой программно на клиенте. Если конечно только его нельзя встраивать в генерируемый запрос. ))
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726236
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИзначально задача бредовая, ибо клиент PK int генерить в принципе не имеет права (догадайтесь, почему).
Клиент в принципе имеет полное право генерировать PK -- тоже почитай про HiLo. И про то, что SCOPE_IDENTITY сломан .
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726261
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучКлиент в принципе имеет полное право генерировать PK
Клиент в принципе не имеет полное право генерировать PK. Исключение составляет гуид, который обеспечивает должную уникальность.
Нахлобуч SCOPE_IDENTITY сломан .
Причём тут SCOPE_IDENTITY и генерация PK средствами SQL сервера?
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726274
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУКлиент в принципе не имеет полное право генерировать PK. Исключение составляет гуид, который обеспечивает должную уникальность.Про HiLo прочитал уже?
МСУПричём тут SCOPE_IDENTITY и генерация PK средствами SQL сервера?Ну кагбэ если тебе SQL Server сгенерирует PK с помощью наиболее широко используемого автоинкремента (Identity), а ты его не сможешь правильно получить -- догадываешься, что потом получится?
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726291
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучПро HiLo прочитал уже?
Изучили уже трассу SQL кода, которую он генерит?
НахлобучНу кагбэ если тебе SQL Server сгенерирует PK с помощью наиболее широко используемого автоинкремента (Identity), а ты его не сможешь правильно получить -- догадываешься, что потом получится?
Юзать output inserted
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726313
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИзучили уже трассу SQL кода, которую он генерит?Слив? Какую трассу, о чем речь вообще? Я задал вопрос, на который можно ответить либо "да", либо "нет".
МСУЮзать output insertedС тебя патч для EF, который это будет делать.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726329
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучСлив?
Куда?
НахлобучКакую трассу, о чем речь вообще?
О трассировке. Дать определение, что-ли?
НахлобучЯ задал вопрос, на который можно ответить либо "да", либо "нет".
Нет.
НахлобучС тебя патч для EF, который это будет делать.
Срочно в EF читать про SP Mapping Insert Function.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726340
DenisVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ
Срочно в EF читать про SP Mapping Insert Function.
Это то понятно ...
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726353
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУО трассировке. Дать определение, что-ли?Мда. Он генерирует ровно два стейтмента, после чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило?
МСУСрочно в EF читать про SP Mapping Insert Function.Замахаешься мапить и плодить говнокод банальных CUD-хранимок.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726368
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобучпосле чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило?
Сгенерили. Конкуренты тоже сгенерили. Дальше что?
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726379
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСгенерили. Конкуренты тоже сгенерили. Дальше что? На, читай :
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.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36726991
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это чё за фигня? Каким образом другое приложение должно узнать о number of digits for LOW ? Само догадаться?
Во-вторых, это не гарантирует вставку такого же значения другим приложением.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36727823
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч
И еще. Сами-то пробовали репродюсировать сломанность скоупидентити? Отвечать: да или нет.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36727961
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЭто чё за фигня? Каким образом другое приложение должно узнать о number of digits for LOW ? Само догадаться?Прочитает из базы данных.
МСУВо-вторых, это не гарантирует вставку такого же значения другим приложением.Ну ты по ссылке-то сходил или как? Гарантирует.
МСУИ еще. Сами-то пробовали репродюсировать сломанность скоупидентити? Отвечать: да или нет.На предыдущем месте работы сами столкнулись с таким.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36727996
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучПрочитает из базы данных.
Атец, срочно читать организацию ACID, конекретно про Isolation (изолированность). Любое обновление определенной транзакции будет скрыто от остальных до тех пор, пока эта транзакция не будет зафиксирована . Выход из сложившейся ситуации - блокировка. Ресурс должен быть успешно захвачен для изоляции. А теперь включите моск и подумайте, надежен ли предлагаемый лисапет клиентских айди? Ответ - нет и только нет.
Тем более гавноHiLo не лочит ресурс, следовательно, надежность такой конструкции - ноль. До сих пор не втумкали, о чём я вещаю?
НахлобучНу ты по ссылке-то сходил или как? Гарантирует.
Читать долго и упорно про изоляцию. Так же не забыть подкрепить знания про атомарности батча.
НахлобучНа предыдущем месте работы сами столкнулись с таким.
Сказочник Вы однако. Весь мир юзает скоуп идентити и тут появляетесь Вы и рвете правду матку. Слабо еще разок спровоцировать описанное?
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728074
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч
Специально по заявкам на пальцах: пример блокировки записи

REPEATABLE READ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
USE Northwind
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO

BEGIN TRAN

-- Накладываем UPDATE LOCK
SELECT * FROM Orders (UPDLOCK)
WHERE OrderId =  10248 

-- Какие-то манипуляции ...
UPDATE Orders
SET ShipVia =  2 
WHERE OrderId =  10248 

-- COMMIT


Обратить внимание на закоментаренный COMMIT. Итак, что это значит? Это значит, что инструкции не могут считывать данные, которые были изменены (если выполняются манипуляции, как у меня в примере UPDATE), но еще не зафиксированы другими транзакциями (как-раз таки закоменченный COMMIT), а также на то, что другие транзакции не могут изменять данные, читаемые текущей транзакцией, до ее завершения .
Но! Другие транзакции могут вставлять новые строки, соответствующие условиям поиска инструкций, содержащихся в текущей транзакции. При повторном запуске инструкции текущей транзакцией будут извлечены новые строки, что приведет к считыванию фантома. В данном случае действуем по ситуации: либо меняем логику либо выбираем другой уровень изоляции.

P.S. Атец, поэтому я в начале и спросил про:

МСУИзучили уже трассу SQL кода, которую он генерит?

... на что увидел одни недоумения и ужас от таких слов.

и после этого, Вы, наконец, родили:

НахлобучМСУО трассировке. Дать определение, что-ли?Мда. Он генерирует ровно два стейтмента, после чего на клиенте можно безопасно сгенерировать 10/100/1000/10000 уникальных идентификаторов. Чем это тебя так возбудило?

Еще раз поясняю, что эти гавнохиловские два стейтмента идут в печку, ибо нет изоляции. Выводы напрашиваются сами собой.

P.S2. В закреплении материала: клиент может генерить уникальные идентификаторы? (гуидов не касается)
P.S3. По поводу гуидов. Никто не запрещает отправить с клиента гуид уже существующий в таблице. Следовательно, невозможность вставки и прочие ошибки. Это так, к размышлению.
P.S4. Генерацией уникального идентификатора должен заниматься сервер и только он (ну можно еще сделать искючение для uniqueidentifier полей, ладно)
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728094
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, конечно, догадываюсь, что автор может хотеть организацию непрерывной последовательности (возможно даже с пересчётом). Это типа как генерация номера счет-фактуры (без пересчета, конечно) и иже. Но, это решается не "PK int не idenity (с)", а отдельным полем. И никакие хило и прочий ширпотреб тут не нужен. Алгоритмы не раз обсуждались на форуме MS SQL - поиск.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728104
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАтец, срочно читать организацию ACID, конекретно про Isolation (изолированность). Любое обновление определенной транзакции будет скрыто от остальных до тех пор, пока эта транзакция не будет зафиксирована . Выход из сложившейся ситуации - блокировка. Ресурс должен быть успешно захвачен для изоляции. А теперь включите моск и подумайте, надежен ли предлагаемый лисапет клиентских айди? Ответ - нет и только нет.
Тем более гавноHiLo не лочит ресурс, следовательно, надежность такой конструкции - ноль. До сих пор не втумкали, о чём я вещаю?
Внимательно следи за пальцами, если читать не хочешь.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table identity_info (hi int not null, lo int not null)
go

insert into identity_info (hi, lo) values ( 10 ,  1000 )
go

declare @hi int, @lo int

begin transaction	
	select @hi = hi, @lo = lo from identity_info with (updlock)
	update identity_info set hi = hi +  1  where hi = @hi
commit transaction

select 'Valid range of identifiers: [' + 
	convert(nvarchar( 100 ), @hi * @lo) + ', ' + 
	convert(nvarchar( 100 ), ((@hi +  1 ) * @lo) -  1 ) +
	']'

Клиент теперь может совершенно безопасно генерировать 1000 идентификаторов. За новой порцией -- то есть, за новым hi -- он еще раз сходит на сервер и получит его в отдельной транзакции.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728238
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч
Я, видимо, в пустую тут трезвонил про атомарности, про изоляцию. Не вижу тут изоляцию батча записи сгенеренного ID.
Никак не допрёте, что транзакция должна закрывать уже после вставки, а не после получения ID.

Во-вторых. Вы издеваетесь? У меня миллион клиентов, теперь прикиньте, какие разрывы в int'e у меня будут? Тут даже bigint не спасет.
Никогда не встречались с переполнением инта? У меня один раз на биллинговом проекте было такое. Это пипец просто.

P.S. Еще раз: поюзайте форум MS SQL, там пробегали интересные алгоритмы реализации последовательностей.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728335
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЯ, видимо, в пустую тут трезвонил про атомарности, про изоляцию. Не вижу тут изоляцию батча записи сгенеренного ID.Да я тоже, похоже, зря бисер мечу. Расскажи, что тут мне изолировать, если у каждого клиента уникальный hi, на основе которого он генерирует уникальные в пределах всей БД идентификаторы? Если у меня hi == 12 и lo = 1000, то идентификаторы [12000, 12999] -- точно уникальные, таких уже никто не получит.

МСУНикак не допрёте, что транзакция должна закрывать уже после вставки, а не после получения ID.Да на вставку можешь её хоть не открывать -- все равно конфликтов идентификаторов не будет.

МСУВо-вторых. Вы издеваетесь? У меня миллион клиентов, теперь прикиньте, какие разрывы в int'e у меня будут? Тут даже bigint не спасет.
Никогда не встречались с переполнением инта? У меня один раз на биллинговом проекте было такое. Это пипец просто.Ну давай считать.

Максимальное число, влезающее в bigint -- это 9223372036854775807. Предположим, клиенты вставляют по миллиону записей в секунду. Допустим, к тому же, что из батча в 1000 идентификаторов мы используем только один, а потом запрашиваем новый hi.

Делим-умножаем и выясняем, что идентификаторов хватит почти на три столетия. А если сократить значение lo до 100 -- то вообще на 2900 лет удовольствие растянется.
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728368
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучРасскажи, что тут мне изолировать, если у каждого клиента уникальный hi, на основе которого он генерирует уникальные в пределах всей БД идентификаторы? Если у меня hi == 12 и lo = 1000, то идентификаторы [12000, 12999] -- точно уникальные, таких уже никто не получит.
Изолировать нужно то, что попытается стиснуться мимо логики identity_info.

НахлобучДа на вставку можешь её хоть не открывать -- все равно конфликтов идентификаторов не будет.
Выше смотреть.

НахлобучНу давай считать.
Да, сейчас посчитаем. Считаете-то неправильно: клиент захватил себе 1000 значений. Использовал только одно значение и отвалился. Пришел другой клиент и захватил себе еще 1000 значений, заюзал только одно и отвалился. Смекаете, о чём я?
По правильному: нужно привязать диапазон значений к клиентую Тогда bigint вполне устроит. Но я не вижу в хиберовой реализации привязки диапазона значений к клиенту. Ясно, а чём трактую или опять разжевать?
...
Рейтинг: 0 / 0
Entity Framework Автоинкремент на клиенте
    #36728415
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИзолировать нужно то, что попытается стиснуться мимо логики identity_info.Ну начинается. Мой тезис был о том, что на клиенте идентификаторы генерировать таки можно, а я сам себе не злобный буратино, чтобы в обход строго определенного механизма это делать. Если кто-то по-другому себя ведет -- его личные трудности.
МСУДа, сейчас посчитаем. Считаете-то неправильно: клиент захватил себе 1000 значений. Использовал только одно значение и отвалился. Пришел другой клиент и захватил себе еще 1000 значений, заюзал только одно и отвалился. Смекаете, о чём я?Ога. Ровно так я и считал; читай внимательнее.
МСУПо правильному: нужно привязать диапазон значений к клиентую Тогда bigint вполне устроит. Но я не вижу в хиберовой реализации привязки диапазона значений к клиенту. Ясно, а чём трактую или опять разжевать?Ты куда вообще смотрел по поводу привязки к клиенту? Давай ссылку на "реализацию" -- файл, строка.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Entity Framework Автоинкремент на клиенте
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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