Призрак переименованного стола
-
10-10-2019 - |
Вопрос
Я переименовал таблицу в базе данных 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
- Откройте свой проект в Visual Studio.
- Откройте свой файл DBML.
- Найдите таблицу, который вы только что переименовали.
- Выберите и удалите его.
- Сохранять.
- Open Server Explorer.
- Подключитесь к вашей базе данных.
- Найдите таблицу, которую вы переименовали.
- Перетащите дизайнер вашего файла DBML.
- Сохраните файл снова.
- Составьте свой проект.
Нет необходимости отбрасывать таблицы из вашего файла DBML. Вы можете просто открыть дизайнер, нажмите на диаграмму классов, представляющая вашу таблицу и введите новое имя таблицы.
Однако, если вы воссоздаете с нуля, важно обновить в Server Explorer, в противном случае он все равно будет извлекать старое имя из схемы.