LINQ to SQL Вставить последовательный GUID - PullRequest
7 голосов
/ 15 апреля 2009

У меня есть база данных, которая является частью схемы репликации слиянием, которая имеет GUID в качестве PK. В частности, тип данных: уникальный идентификатор , значение по умолчанию (newsequentialid ()) , RowGUID установлен на Да . Когда я делал InsertOnSubmit (CaseNote), я думал, что смогу оставить CaseNoteID в покое, и база данных введет следующий последовательный GUID, как это происходит, если вы вручную введете новую строку в MSSMS. Вместо этого он отправляет 00000000-0000-0000-0000-000000000000 . Если я добавлю CaseNoteID = Guid.NewGuid(),, я получу GUID, но не последовательный (я уверен).

Есть ли способ позволить SQL создать следующий последовательный идентификатор в LINQ InsertOnSubmit ()?

Для справки ниже приведен код, который я использую для вставки новой записи в базу данных.

            CaseNote caseNote = new CaseNote
                                {
                                    CaseNoteID = Guid.NewGuid(),
                                    TimeSpentUnits = Convert.ToDecimal(tbxTimeSpentUnits.Text),
                                    IsCaseLog = chkIsCaseLog.Checked,
                                    ContactDate = Convert.ToDateTime(datContactDate.Text),
                                    ContactDetails = memContactDetails.Text
                                };
        caseNotesDB.CaseNotes.InsertOnSubmit(caseNote);

        caseNotesDB.SubmitChanges();

Основываясь на одном из предложенных ниже предложений, я включил функцию Autogenerated в LINQ для этого столбца, и теперь получаю следующую ошибку -> В целевой таблице оператора DML не может быть никаких включенных триггеров, если инструкция содержит OUTPUT предложение без предложения INTO. Идеи?

Ответы [ 7 ]

5 голосов
/ 15 апреля 2009

Сверху окна «Связанные» справа:

Последовательный GUID в Linq-to-Sql?

Если вам действительно нужно значение «next», используйте int64 вместо GUID. COMB guid обеспечит заказ GUID.

5 голосов
/ 15 апреля 2009

В конструкторе Linq to Sql установите для свойства Auto Generated Value значение true для этого столбца.

Это эквивалентно IsDbGenerated свойству для столбца. Единственным ограничением является то, что вы не можете обновить значение с помощью Linq.

1 голос
/ 15 июля 2010

Тебе действительно нужно было сделать пару вещей.

  1. Удалить любое присвоение свойству типа GUID
  2. Изменить столбец на автоматически сгенерированный
  3. Создайте ограничение в базе данных, чтобы столбец по умолчанию был равен NEWSEQUENTIALID ()
  4. Вставьте при отправке так же, как и раньше.

При вставке в таблицу идентификатор будет создан и будет последовательным. Сравнение производительности NEWSEQUENTIALID () с другими методами

1 голос
/ 01 августа 2009

Что касается вашей «В целевой таблице оператора DML не может быть никаких включенных триггеров, если инструкция содержит предложение OUTPUT без предложения INTO», ознакомьтесь с этой статьей MS KB, в LINQ она выглядит как ошибка:

http://support.microsoft.com/kb/961073

0 голосов
/ 13 апреля 2016

Вы должны обработать метод OnCreated ()

Partial Class CaseNote
    Sub OnCreated()
        id = Guid.NewGuid()
    End Sub
End Class
0 голосов
/ 25 мая 2012

Masstransit использует combguid:

https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit/NewId/NewId.cs

это то, что вы ищете?

из Википедии:

Последовательные алгоритмы

GUID обычно используются в качестве первичного ключа таблиц базы данных, и при этом часто таблица имеет кластерный индекс по этому атрибуту. Это представляет проблему производительности при вставке записей, потому что Полностью случайный GUID означает, что запись может быть вставлена ​​куда угодно в таблице, а не просто добавляется в конце его. Как способ смягчить эту проблему, обеспечивая при этом достаточную случайность эффективно предотвращать повторяющиеся столкновения номеров, несколько алгоритмов были использованы для генерации последовательных идентификаторов GUID. Первая техника, описанный Джимми Нильссоном в августе 2002 г. [7] и называемый «COMB» («комбинированная guid / timestamp»), заменяет последние 6 байтов Data4 с младшими 6 байтами текущей системной даты / времени. Хотя это может привести к GUID, которые генерируются не по порядку в те же доли секунды, его тесты показали, что реальное влияние на вставку. Одним из побочных эффектов этого подхода является что дата и время вставки могут быть легко извлечены из Значение позже, при желании. Начиная с версии Microsoft SQL Server В 2005 году Microsoft добавила функцию в язык Transact-SQL под названием NEWSEQUENTIALID (), [8], который генерирует GUID, которые гарантированно увеличение стоимости, но может начинаться с меньшего числа (все еще гарантировано уникальный), когда сервер перезагружается. Это уменьшает количество базы данных страницы таблицы, где могут происходить вставки, но это не гарантирует, что значения всегда будут увеличиваться в стоимости. Значения, возвращаемые этим Функция может быть легко предсказана, поэтому этот алгоритм не подходит для генерации непонятных чисел в целях безопасности или хэширования. В 2006, программист обнаружил, что функция SYS_GUID предоставлена ​​Oracle возвращал последовательные идентификаторы GUID на некоторых платформах, но это, кажется, быть ошибкой, а не особенностью. [9]

0 голосов
/ 05 февраля 2010

В Linq2Sql есть ошибка при использовании автоматически сгенерированного (guid / sequential guid) первичного ключа и наличии триггера на таблице ... именно это и вызывает вашу ошибку. Существует исправление для проблемы:

http://support.microsoft.com/default.aspx?scid=kb;en-us;961073&sd=rss&spid=2855

...