У меня есть веб-приложение MVC с таблицей в модели, к которой я хотел бы добавить. Мне установили первичный ключ наряду с другими полями данных, но каждый раз я пытаюсь добавить к таблице, я получаю следующую ошибку:
"Не может вставить явное значение для столбца идентификационных данных в таблице 'TABLE_NAME', когда IDENTITY_INSERT установлен на ПРОЧЬ".
Я не уверен, почему эта проблема подходит, мне установили первичный ключ как идентификационные данные, и это также установлено на автоматический инкремент в разработчике таблицы Visual Studio. Есть ли какой-либо способ, которым я могу скорректировать параметр IDENTITY_INSERT в разработчике таблицы в Visual Studio?? Или есть ли некоторая другая проблема, которая могла бы вызывать это.
ОБНОВЛЕНИЕ: @Brian - Насколько я могу сказать, я не устанавливаю значение явно, вот код, который добавляет к таблице (таблицам).
//Add viewer
public void addViewer(ModelStateDictionary modelState, Users user)
{
var userToAdd = new UserRoles();
userToAdd.Users = user;
if (String.IsNullOrEmpty(userToAdd.Users.Username))
{
modelState.AddModelError("noName", "Please enter a username for the new Viewer");
}
//See if Committee Member already exists
try
{
userToAdd = _db.UserRoles.First(ur => ur.Users.Username == userToAdd.Users.Username);
modelState.AddModelError("userExists", "A Viewer with that username already exists in the system");
return;
}
catch (Exception e)
{
if (modelState.IsValid)
{
//Assign Committee Member role
userToAdd.Role = "Viewer";
userToAdd.Users = user;
//Add new Committee Member to User Roles and associated username to Users
_db.AddToUserRoles(userToAdd);
_db.SaveChanges();
}
}
}
Вы пытаетесь явно установить значение первичного ключа, возможно, в сущности LINQ; вы пытаетесь сказать, например, что вставьте 1 в поле первичного ключа, которое является идентификатором, и LINQ видит это как вставленное значение.
Также при использовании LINQ to SQL в типе данных поля сервера убедитесь, что в поле типа данных указано IDENTITY; если он не говорит ИДЕНТИЧНОСТЬ, возможно, в LINQ произошла ошибка конфигурации.
Похоже, что ваш код пытается вставить конкретное значение в столбец первичного ключа, который определен как IDENTITY.
Чтобы избежать ошибки - не вставляйте никаких значений! Позвольте базе данных получить новое значение для строки, которую вы вставляете.
Если вы используете Linq-to-SQL, щелкните на таблице в визуальном дизайнере и посмотрите на свойства:
"Auto Generated Value" должно быть "True" (что не является значением по умолчанию), а Auto-Sync должно быть "OnInsert" (опять же: не по умолчанию). Также установите для "Первичного ключа" значение true и убедитесь, что "Тип данных сервера" правильный - Int NOT NULL IDENTITY
(или что-то подобное).
Если вам когда-нибудь понадобится отменить поведение по умолчанию (обычно только в сценариях очистки или при одноразовых манипуляциях с данными), вы можете включить IDENTITY_INSERT в таблице, например, после этого вы можете вставить любое значение в столбец IDENTITY:
SET IDENTITY_INSERT YourTableName ON
INSERT INTO YourTableName(IdentityColumn) VALUES(5555)
SET IDENTITY_INSERT YourTableName OFF
Это скорее задача по очистке/администрированию данных - не то, что вы должны делать постоянно как разработчик.
Спасибо всем за ваши предложения, в итоге я решил свою проблему, обновив модель. Моя модель была создана до того, как я установил первичный ключ на Identity spec с автоинкрементом, поэтому, я думаю, все, что нужно было сделать, это обновить модель, чтобы она заработала.