Призрак переименованного стола - PullRequest
1 голос
/ 15 ноября 2010

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

Таблица используется в приложении ASP.NET 4.0.Я использую LINQ to 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 to SQL dbml и создал новый.Я искал во всем исходном коде строки, содержащие старое имя таблицы.Ничего такого.Код компилируется ...

Куда еще я могу обратиться?

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

также не обнаруживает никаких признаков старого имени таблицы в FK.

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

Ответы [ 5 ]

3 голосов
/ 15 ноября 2010

Ответ:

Проблема, как заявили Стю и Старк, была спусковым крючком. Стю дал мне 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

Теперь все снова работает.

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

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

Живи и учись.

0 голосов
/ 15 ноября 2010

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

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

0 голосов
/ 15 ноября 2010

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

0 голосов
/ 15 ноября 2010
  1. откройте ваш проект в visual studio.
  2. откройте файл dbml.
  3. найдите таблицу, которую вы только что переименовали.
  4. выберите и удалите ее.
  5. Сохранить.
  6. Открыть обозреватель сервера.
  7. Подключиться к базе данных.
  8. Найти таблицу, которую вы переименовали.
  9. Перетащите идобавьте конструктор вашего dbml-файла.
  10. Сохраните файл еще раз.
  11. Скомпилируйте ваш проект.
0 голосов
/ 15 ноября 2010

Когда вы воссоздали свой файл linq to sql, вы не забыли обновить браузер сервера, чтобы он сначала отражал изменение имени таблицы?

Правка - я имею в виду браузер сервера Visual Studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...