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

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

А за такое

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

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

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
07.07.2010, 14:48
    #36728094
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framework Автоинкремент на клиенте
Я, конечно, догадываюсь, что автор может хотеть организацию непрерывной последовательности (возможно даже с пересчётом). Это типа как генерация номера счет-фактуры (без пересчета, конечно) и иже. Но, это решается не "PK int не idenity (с)", а отдельным полем. И никакие хило и прочий ширпотреб тут не нужен. Алгоритмы не раз обсуждались на форуме MS SQL - поиск.
...
Рейтинг: 0 / 0
07.07.2010, 14:52
    #36728104
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framework Автоинкремент на клиенте
МСУАтец, срочно читать организацию 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
07.07.2010, 15:37
    #36728238
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Entity Framework Автоинкремент на клиенте
Нахлобуч
Я, видимо, в пустую тут трезвонил про атомарности, про изоляцию. Не вижу тут изоляцию батча записи сгенеренного ID.
Никак не допрёте, что транзакция должна закрывать уже после вставки, а не после получения ID.

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

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

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

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

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

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

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

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


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