LINQ to SQL Вставить последовательный GUID

У меня есть база данных, которая является частью схемы репликации слиянием, которая имеет GUID в качестве PK. В частности, тип данных - uniqueidentifier, значение по умолчанию (newsequentialid ()), для RowGUID установлено значение Yes. Когда я делаю 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();

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


person Refracted Paladin    schedule 15.04.2009    source источник


Ответы (7)


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

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

person Keltex    schedule 15.04.2009
comment
Я попробовал это и теперь получаю следующую ошибку: ›Целевая таблица оператора DML не может иметь никаких включенных триггеров, если оператор содержит предложение OUTPUT без предложения INTO. - person Refracted Paladin; 15.04.2009
comment
Для меня это уже было установлено, но БД все еще пытается назначить guid по умолчанию 0, а не генерировать его. - person DCShannon; 14.05.2015

Вверху поля "Похожие" справа:

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

Если вам действительно нужно «следующее» значение, используйте int64 вместо GUID. COMB guid гарантирует, что GUID упорядочены.

person Michael Meadows    schedule 15.04.2009
comment
+1. Если вам нужен порядок, используйте числовой тип. Гиды были разработаны, чтобы работать как уникальные идентификаторы, а не обеспечивать какой-либо метод упорядочивания. - person Adam Robinson; 15.04.2009
comment
правда, но это может вызвать большой отток в двух случаях: кластеризованное индексирование и производительность репликации (что похоже на проблему OP). COMB помогает в этом, но не обязательно делает их последовательными. - person Michael Meadows; 15.04.2009
comment
@Michael - спасибо, что указали на это. Странно, что это не было одним из предложений, когда я создавал заголовок - person Refracted Paladin; 15.04.2009
comment
избавили меня от необходимости искать статью, в которой я изначально нашел COMB GUID много лет назад. - person Michael Meadows; 15.04.2009

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

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

person Community    schedule 31.07.2009

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

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

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

person C Tierney    schedule 15.07.2010
comment
@C Tierney: Чем это отличается от принятого решения? Похоже на то же самое, только что изложенное, верно? - person Refracted Paladin; 15.07.2010

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

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

person Nicholas    schedule 05.02.2010

Masstransit использует гребенчатый гид:

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

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

из википедии:

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

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

person Community    schedule 25.05.2012

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

Partial Class CaseNote
    Sub OnCreated()
        id = Guid.NewGuid()
    End Sub
End Class
person RonaldPaguay    schedule 13.04.2016