Столбец Identity сброса в SQL Server

Обычно ошибка « Обнаружен конфликт версий » происходит из-за того, что с версиями графа зависимостей что-то не так.

ошибка: обнаружен конфликт версий для Microsoft.EntityFrameworkCore. Установите / обратитесь к Microsoft.EntityFrameworkCore 2.2.3 напрямую в core-udemy проекта, чтобы решить эту проблему.

ошибка: core-udemy -> Microsoft.EntityFrameworkCore.SqlServer 2.2.3 -> Microsoft.EntityFrameworkCore.Relational 2.2.3 -> Microsoft.EntityFrameworkCore (> = 2.2.3)

ошибка : core-udemy -> Microsoft.AspNetCore.App 2.1.1 -> Microsoft.EntityFrameworkCore (> = 2.1.1 & amp; < 2.2.0) .

] blockquote>
  1. Как описывает информация, ваш проект зависит от Microsoft.AspNetCore.App v2.1.1, для которого требуется версия Microsoft.EntityFrameworkCore (2.1.1 & amp; < 2.2. 0) [1 138].

  2. Однако, используя dotnet add core-udemy package Microsoft.EntityFrameworkCore.SqlServer, вы устанавливаете «текущую» версию Microsoft.EntityFrameworkCore. Следующий снимок экрана с NuGet показывает, что вы устанавливаете Microsoft.EntityFrameworkCore (2.2.3) :

[1117 ] enter image description here

Поскольку вы используете ASP.NET Core 2.1, , вы можете установить соответствующие пакеты с опцией --version 2.1.* :

dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 2.1.*

] Это приведет к зависимости, как показано ниже:



    ...

    

Как только вы исправите конфликт версий, вы можете запустить dotnet clean & amp; dotnet restore & amp; dotnet build, и тогда второй вопрос будет решен.


Кроме того, метапакет Microsoft.AspNetCore.App (v2.1.1) уже установил зависимость от Microsoft.EntityFrameworkCore.SqlServer (>= 2.1.1 && < 2.2.0):

enter image description here

вам не нужно добавлять такую ​​ссылку на пакет вручную.

6
задан Cade Roux 20 March 2009 в 13:49
поделиться

10 ответов

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

Если у Вас действительно должна быть некоторая форма линейного идентификатора, который всегда запускается в 0 (это может затем указать на проблему с разработкой программного обеспечения), затем, у Вас может быть вторичный столбец ID в дополнение к первичному ключу, который Вы затем обновляете для перестановки более высоких значений вниз звонивший с оператором, таких как:

UPDATE table
SET secondaryID = secondaryID - 1
WHERE secondaryID > (SELECT secondaryID FROM table WHERE primaryID = [id to delete]);

DELETE FROM table
WHERE primaryID = [id to delete];

Я сильно препятствую такой практике - если Ваши идентификаторы 'пропускают' значения из-за удаленных записей, программное обеспечение должно протестировать на существование этих значений, а не просто wigging.

3
ответ дан 8 December 2019 в 02:20
поделиться

Идентификатор является уникальным идентификатором строки.

Это может использоваться для соединения строки с другой строкой в другой таблице. Отсутствие идентификатора содержит информацию сам по себе также, поскольку это ясно сказало бы, что было удалено. Запуск переработать поражения Идентификационных номеров полностью цель наличия уникального идентификатора, и не имеет никакого смысла действительно. После того как идентификатор присвоен строке, Вы не должны произвольно изменять его.

Предположите в течение секунды, что, когда кто-то умирает, они передают его номер социального страхования (идентификатор) кому-то еще. Это приведет к передаче всей старой информации, которая была связана с номером социального страхования мертвого человека тому новому человеку, который не имеет никакого смысла. То же происходит с идентификаторами, если идентификатор будет повторно присвоен, то он наследует любые старые данные, которые были ранее связаны с ним.

4
ответ дан 8 December 2019 в 02:20
поделиться

Вы используете идентификатор в качестве больше, чем просто идентификатор. Если это так, Вы не сможете использовать автоматическое инкрементное поле. Необходимо будет обработать это в коде.

2
ответ дан 8 December 2019 в 02:20
поделиться

Это не то, как идентификаторы работают, и не, как они должны работать. Идентификатор никогда не должен изменяться, или вся связанная информация указала бы на неправильную строку.

Вместо этого почему бы не добавить столбец "External_ID", которым Вы управляете? Или число их динамично в Вашем запросе (с вычисляемым столбцом?)

5
ответ дан 8 December 2019 в 02:20
поделиться

Это было бы намного лучше решено с помощью другого метода, чем перенумеровав столбец идентификационных данных каждый раз, когда строка удалена.

Трудно для высказывания точно, что еще Вы обошлись бы без знания, почему Ваше приложение имеет эту потребность, но то, что для Вашего приложения нужна эта функциональность, вероятно, показательно из проблемы проектирования где-нибудь.

3
ответ дан 8 December 2019 в 02:20
поделиться

Это - такая плохая идея таким количеством способов. Я дебатирую, должен ли я показать Вам, как сделать это. Никогда не должно быть причины изменить идентификационные данные строки, после того как она установлена.

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

Следует иметь в виду, составляете ли Вы какие-либо таблицы, которые связываются с Вашей таблицей контакта, и Вы начинаете изменять свой идентификатор, необходимо обновить все те таблицы также. Который станет дорогим...

16
ответ дан 8 December 2019 в 02:20
поделиться

Это, собирается вернуться к реальности медленный, после того как у Вас есть больше, чем тривиальная сумма записей в базе данных. Столбец идентификационных данных не будет работать на Вас, необходимо сделать некоторый пользовательский tsql, чтобы продолжать изменять все числа - но очень плохая идея, imo.

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

Необходимо заново продумать дизайн.

6
ответ дан 8 December 2019 в 02:20
поделиться

Я написал приложение для обработки многоуровневой программы продаж. Конечно, люди бросают учебу. В нашем тоже нужно было вставлять людей.

Вы на правильном пути с одной модификацией.

Идентификационный номер (ID) и порядковый номер (seq) - две разные вещи. У них нет никаких отношений друг с другом.

Никогда не меняйте ID. После назначения, всегда назначается.

Создайте столбец (cNEXT) в вашей таблице для последовательности и заполните его идентификаторами. «Какой идентификатор будет следующим в этой последовательности?»

Перемешайте идентификаторы в cNEXT, переназначая cNEXT, в любое время. Любая сохраненная процедура может это сделать.

Тогда у вас также есть гибкость для создания непоследовательных цепочек идентификаторов. Это полезно, когда люди переезжают в разные регионы. или получите повышение в разных группах.

Надеюсь, это поможет! :)

0
ответ дан 8 December 2019 в 02:20
поделиться

Поиск в Google за 1 минуту дал мне страницу, которую я не могу отобразить. Погуглите это, и это будет ваша первая ссылка с 01.06.2009: tsql fix "столбец идентификаторов"

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

Если ваша таблица контактов является вашей ЕДИНСТВЕННОЙ таблицей или имеет НУЛЕВЫЕ отношения на основе этого поля идентификатора, вы можете установить для свойства Identity значение NO, изменить нумерацию значений с 1 на COUNT (ID), затем установить для свойства Identity значение YES и повторно запишите идентификатор для завершения, используя:

DECLARE @MaxID INT

SELECT @MaxID = COUNT (ID) FROM TableID

DBCC CHECKIDENT (' TableID ', RESEED, @MaxID)

В этом сценарии вы можете использовать приведенный выше сценарий повторного заполнения после каждого набора удалений (но измените COUNT (ID) на MAX (ID), как только все будет изначально и правильно настроено, это добавляет небольшая скорость по мере увеличения таблицы) до любых дополнительных вставок или обновлений ограничений внешнего ключа. Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;) (Я научился этому на собственном опыте) Если у вас есть вопросы, напишите мне на адрес mraarone et yahoo d0t com.

вы можете использовать приведенный выше сценарий повторного заполнения после каждого набора удалений (но измените COUNT (ID) на MAX (ID), как только все будет изначально и правильно настроено, это немного повысит скорость по мере увеличения таблицы) до любых дополнительных вставок или обновления ограничений внешнего ключа. Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;) (Я научился этому на собственном опыте) Если у вас есть вопросы, напишите мне на адрес mraarone et yahoo d0t com.

вы можете использовать приведенный выше сценарий повторного заполнения после каждого набора удалений (но измените COUNT (ID) на MAX (ID), как только все будет изначально и правильно настроено, это немного повысит скорость по мере увеличения таблицы) до любых дополнительных вставок или обновления ограничений внешнего ключа. Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;) (Я научился этому на собственном опыте) Если у вас есть вопросы, напишите мне на адрес mraarone et yahoo d0t com.

Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;) (Я научился этому на собственном опыте) Если у вас есть вопросы, напишите мне на адрес mraarone et yahoo d0t com.

Убедитесь, что вы используете ТРАНЗАКЦИИ, обернутые вокруг блоков удаления и повторного заполнения, и убедитесь, что таблица допускает только синхронные транзакции, это предотвратит размещение любых данных в середине повторного заполнения.

Сложный, а? Вот почему лучше начинать с правильной ноги. ;) (Я научился этому на собственном опыте) Если у вас есть вопросы, напишите мне на адрес mraarone et yahoo d0t com.

1
ответ дан 8 December 2019 в 02:20
поделиться

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

DBCC CHECKIDENT ({table name}, Reseed, 0)

* Удалить все строки из всех таблиц сначала используя идентификатор

0
ответ дан 8 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: