ОШИБКА: IDENTITY_INSERT имеет значение OFF

#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);
 }