#sql #vb.net #linq
#sql #vb.net #linq
Вопрос:
Я получаю эту ошибку в своем скрипте:
Не удается вставить явное значение для столбца identity в таблице ‘GameMaster’, когда IDENTITY_INSERT имеет значение OFF.
Вот код, который выполняется:
Dim db = New PlayerTestDataContextDataContext()
If txtNewGM.Text = "" Then
lbWarning.Text = "Please enter a name!"
Else
Dim GM As New GameMaster With {
.GameMasterName = txtNewGM.Text}
db.GameMasters.InsertOnSubmit(GM)
db.SubmitChanges()
Me.Close()
End If
В моей базе данных есть две таблицы. Проигрыватель, в котором есть столбцы PlayerID и PlayerName. И GameMasters, который имеет GameMasterID, PlayerID и GameMasterName, причем PlayerID является исходным ключом из таблицы player. У меня есть спецификация идентификации первичных ключей, для каждой таблицы которой задано значение yes (PlayerID для игроков и GameMasterID для гейммастеров). Что вызывает эту ошибку. Я поискал вокруг и нашел похожие проблемы, но ни одна из них не была полностью одинаковой…
Комментарии:
1. Во время отладки вы можете видеть значение
GM.GameMasterID
? Если у него есть значение, оно завершится ошибкой, поскольку это PK с идентификатором в этой таблице.2. Я забыл, как просматривать значения во время отладки. Я использовал почти точно такой же код для создания новых проигрывателей, и это работает. Единственное отличие заключается в том, что класс GameMaster содержит в себе идентификатор FK PlayerID. Может ли это быть частью причины ошибки?
3. Вычеркните это. Я не исправил свою ошибку.
4. Проблема была связана с внешним ключом, который не получал присвоенное ему значение. Я добавил обновление для этого FK в коде, и оно отлично сработало!
Ответ №1:
Скорее всего, у вас есть целочисленное свойство GameMasterID, объявленное в классе GameMaster. Поскольку целочисленные свойства по умолчанию равны нулю, при выполнении вставки выполняется попытка установить все свойства, включая свойство GameMasterID. Поэтому он пытается установить столбец identity равным нулю, что приводит к сбою.
Ответ №2:
Похоже, что ваша процедура доступа к данным неявно передает ненулевое значение при выполнении insert (возможно, автоматическая поддержка с неявным нулевым значением).
Единственный раз, когда у меня когда-либо возникала эта ошибка, это когда я пытался создать новую запись в таблице базы данных и попытался установить поле identity. Я думаю, что это, вероятно, единственный способ, которым вы это получите.
Редактировать:
Почти наверняка здесь играет роль автоматическая поддержка.
Странно, что компилятор защитит вас от :-
protected void Page_Load(object sender, EventArgs e)
{
int beef;
string aLing = String.Format("{0}", beef);
}
Но не :-
public int Beef { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
string aLing = String.Format("{0}", Beef);
}