GUID 00000000-0000-0000-0000-000000000000, вызывающий нарушение индекса слияния - PullRequest
3 голосов
/ 09 августа 2011

У нашего разработчика есть проект linq-2-sql, который общается с моей базой данных.База данных участвует в репликации слиянием.Он был в использовании в течение некоторого времени и работал нормально.Недавняя таблица была добавлена ​​в схему, и теперь она вызывает проблемы при добавлении новых записей.

Пользователь получает сообщение об ошибке, в котором говорится, что индекс, связанный с guid, который автоматически создает репликация слиянием, нарушает уникальное ограничение.

Из того, что я могу сказать, таблица ничем не отличается от других, которые участвуют.Я воссоздал всю модель публикации / подписки репликации с нуля, и все продолжает работать, за исключением одной таблицы.

У кого-нибудь есть идеи?Создаваемое руководство отображается как 00000000-0000-0000-0000-000000000000, что объясняет, почему это дубликат.Почему действительный guid не создается linq?

Ответы [ 4 ]

11 голосов
/ 09 августа 2011

Использовали ли вы "new Guid ()" где-то в своей базе кода, когда вы имели в виду "Guid.NewGuid ()"?

2 голосов
/ 10 августа 2011

При исследовании ваших предложений мы обнаружили, что именно эта таблица была единственной таблицей, в которой поле guid вообще содержалось в классе DBML.Все остальные таблицы были добавлены в DBML до публикации базы данных для репликации слиянием (следовательно, их соответствующие поля guid не были включены в DBML).

Итак, я вручную удалил поле guid из таблицы проблем в DBML , и проблема исчезла.Фактически проблема была вызвана тем, что LINQ не создал guid, как это должно быть в сгенерированных классах.

В этом случае проще всего было оставить создание guid для триггеров публикации и значения по умолчанию newid (), как установлено в SQL.(он все еще находится в базе данных, но не в dbml)

Ничто в приложении не использует эти поля guid ... это чисто для SQL, чтобы управлять реализованной нами схемой репликации слиянием - поэтому удаление из DBML былосамый легкий.

2 голосов
/ 09 августа 2011

Я столкнулся с подобной проблемой.Как упомянул Марк в комментарии, Guid () должен быть правильно использован.

Guid asm = new Guid(); // gives 00000000-0000-0000-0000-000000000000

Вместо этого используйте

Guid asm = Guid.NewGuid();
2 голосов
/ 09 августа 2011

При использовании Linq-To-SQL убедитесь, что свойство IsDbGenerated имеет значение true, а база данных фактически настроена для создания идентификатора (используя newid () в качестве значения по умолчанию) ).

В противном случае убедитесь, что код .net действительно генерирует идентификаторы.

...