1

我已将 SQL Server 2008 数据库中的一个表从 eL_CourseStepUserNotes 重命名为 StepUserNotes。我使用 SSMA 重命名了表。

该表用于 ASP.NET 4.0 应用程序。我对所有 CRUD 使用 LINQ to SQL。问题在于以下代码:

    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 Server 数据库中的所有外键,如 SO 问题所示: sql:need to change constraint on rename table?

在 FK 中也没有显示旧表名的迹象。

我完全不知道在哪里看或下一步要尝试什么。有什么建议么?

4

5 回答 5

3

回答:

正如斯图和斯塔克所说,这个问题是一个触发因素。Stu 给了我运行解决问题的 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 字段有关。

我不知道为什么当表名更改时触发器会更新。我检查了所有的键和关系,但忘记了这个触发器。

活到老,学到老。

于 2010-11-15T20:23:31.603 回答
0

当您重新创建 linq to sql 文件时,您是否记得刷新服务器浏览器以首先反映表名更改?

编辑 - 我的意思是 Visual Studio 服务器浏览器。

于 2010-11-15T18:07:04.143 回答
0

您需要重新绑定 LINQ To SQL 类,删除所有表,然后从服务器资源管理器中再次添加它们

于 2010-11-15T18:07:45.583 回答
0
  1. 在 Visual Studio 中打开您的项目。
  2. 打开你的 dbml 文件。
  3. 找到刚刚重命名的表。
  4. 选择并删除它。
  5. 节省。
  6. 打开服务器资源管理器。
  7. 连接到您的数据库。
  8. 找到您已重命名的表。
  9. 拖放到 dbml 文件的设计器上。
  10. 再次保存文件。
  11. 编译你的项目。
于 2010-11-15T18:56:28.127 回答
0

不必从 DBML 文件中删除表。您可以简单地打开设计器,单击代表您的表的类图并输入表的新名称。

但是,如果您从头开始重新创建,则在服务器资源管理器中刷新很重要,否则它仍会从架构中提取旧名称。

于 2010-11-15T19:00:11.860 回答