Вопрос

Я переименовал таблицу в базе данных SQL Server 2008, от EL_COURSESTEPUSERNOTES до StepUsernotes. Я переименовал таблицу, используя SSMA.

Таблица используется в приложении ASP.NET 4.0. Я использую LINQ для SQL для всех CRUD. Проблема в том, что следующий код:

    dbDataContext db = new dbDataContext();
    var k = (from c in db.StepUserNotes
             where ((c.CourseStepFK == q.CourseStepFK) && (c.UserFK == q.UserFK))
             select c).FirstOrDefault();
    try
    {
        db.StepUserNotes.InsertOnSubmit(q);
        db.SubmitChanges();
    }
    catch
    {

    }

Терпит неудачу на линии DB.Submitchanges, говоря:

SqlException was caught. Invalid object name 'eL_CourseStepUserNotes'.

Т.е. старое имя для стола вернулось, чтобы преследовать меня.

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

Где еще я могу посмотреть?

Ошибка возвращается с SQL Server и использует утилиту для перечисления всех иностранных ключей в базе данных SQL Server, показанной в вопросе:SQL: нужно изменить ограничение на таблице переименования?

Не раскрывает признаков старого имени таблицы в FKS.

Я с полной потерей относительно того, где искать или что попробовать дальше. Какие-либо предложения?

Это было полезно?

Решение

Отвечать:

Проблема, как указано Стю и Старк, была спусковой крючкой. Стю дал мне SQL, чтобы запустить, что прибило проблему. Это задокументировано здесь на случай, если кто -то еще столкнется с этим:

Select Object_Name(ID) From SysComments 
       Where Text Like '%el_CourseStepUserNotes%'

Это выявило триггер со следующим именем:

tr_eL_CourseStepUserNotes

Триггер ссылался на старое имя следующим образом:

SET DateAmended = CURRENT_TIMESTAMP
     FROM eL_CourseStepUserNotes PP  
            INNER JOIN inserted i  ON PP.UserNoteId = i.UserNoteId

Сейчас все работает снова.

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

Я понятия не имею, почему триггер обновляется при изменении имени таблицы. Я проверил все ключи и отношения, но забыл этот триггер.

Живи и учись.

Другие советы

Когда вы воссоздали свой LINQ в SQL File, вы не забыли обновить браузер сервера, чтобы сначала отразить изменение имени таблицы?

Редактировать - я имею в виду браузер Visual Studio Server.

Вам нужно переподметь свой LINQ в класс SQL, отбросить все таблицы, а затем добавить их снова с Server Explorer

  1. Откройте свой проект в Visual Studio.
  2. Откройте свой файл DBML.
  3. Найдите таблицу, который вы только что переименовали.
  4. Выберите и удалите его.
  5. Сохранять.
  6. Open Server Explorer.
  7. Подключитесь к вашей базе данных.
  8. Найдите таблицу, которую вы переименовали.
  9. Перетащите дизайнер вашего файла DBML.
  10. Сохраните файл снова.
  11. Составьте свой проект.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top