改名されたテーブルの幽霊
-
10-10-2019 - |
質問
EL_COURSESTEPUSERNOTESからStepUsernotesまで、SQL Server 2008データベースのテーブルを変更しました。 SSMAを使用してテーブルの名前を変更しました。
このテーブルは、ASP.NET 4.0アプリで使用されています。私はすべてのCRUDに対してLINQを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をsql dbmlファイルに削除し、新しいファイルを作成しました。古いテーブル名を含む文字列をすべてのソースコードを検索しました。何もない。コードがコンパイル...
他にどこを見ることができますか?
エラーはSQL Serverから戻ってきており、ユーティリティを使用して、質問に示されているSQL Serverデータベースのすべての外部キーをリストしています。SQL:変更テーブルの名前の制約を変更する必要がありますか?
FKSの古いテーブル名の兆候も明らかにしません。
私は、どこを見るべきか、次に何を試すべきかについて完全に喪失しています。助言がありますか?
解決
答え:
StuとStarkが述べたように、問題は引き金でした。 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
すべてが再び機能しています。
愚かな私、私が最初に得たエラーがデータメンドフィールドに関連していたため、トリガーが問題であることに気付くべきでした。
テーブル名が変更されたときにトリガーが更新される理由がわかりません。私はすべてのキーと関係をチェックしましたが、このトリガーを忘れていました。
生活し、学びます。
他のヒント
LINQをSQLファイルに再作成したとき、最初にテーブル名の変更を反映するためにサーバーブラウザを更新することを覚えていましたか?
編集 - Visual Studio Serverブラウザーを意味します。
LINQをSQLクラスに再構築し、すべてのテーブルをドロップしてから、サーバーエクスプローラーから再度追加する必要があります
- Visual Studioでプロジェクトを開きます。
- DBMLファイルを開きます。
- 名前が変更されたテーブルを見つけてください。
- 選択して削除します。
- 保存する。
- サーバーエクスプローラーを開きます。
- データベースに接続します。
- 名前が変更されたテーブルを見つけてください。
- DBMLファイルのデザイナーをドラッグアンドドロップします。
- ファイルをもう一度保存します。
- プロジェクトを編集します。
DBMLファイルからテーブルをドロップする必要はありません。デザイナーを開くだけで、テーブルを表すクラス図をクリックして、テーブルの新しい名前を入力できます。
ただし、ゼロから再作成している場合は、サーバーエクスプローラーで更新することが重要です。そうしないと、古い名前をスキーマから引き出します。