代码之家  ›  专栏  ›  技术社区  ›  awrigley

重命名表的幽灵

  •  1
  • awrigley  · 技术社区  · 15 年前

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

    在fks中也没有显示旧表名的符号。

    我完全不知道该去哪里看看,下一步该做什么。有什么建议吗?

    5 回复  |  直到 15 年前
        1
  •  3
  •   awrigley    15 年前

    回答:

    斯图和斯塔克说,这个问题是一个导火索。斯图给了我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
    

    现在一切都恢复了。

    愚蠢的我,我应该意识到触发是个问题,因为我得到的第一个错误与日期修正字段有关。

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

    活到老学到老。

        2
  •  0
  •   asawyer    15 年前

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

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

        3
  •  0
  •   bevacqua    15 年前

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

        4
  •  0
  •   Mazhar Karimi    15 年前
    1. 在Visual Studio中打开项目。
    2. 打开DBML文件。
    3. 查找刚刚重命名的表。
    4. 选择并删除它。
    5. 保存。
    6. 打开服务器资源管理器。
    7. 连接到数据库。
    8. 查找已重命名的表。
    9. 拖放到DBML文件的设计器上。
    10. 再次保存文件。
    11. 编译你的项目。
        5
  •  0
  •   jason    15 年前

    不需要从DBML文件中删除表。只需打开设计器,单击表示表的类图,然后键入表的新名称。

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