未来技術の光と影。
SIYOU’s Chronicle




■内容

SQL Server側 テーブル値関数が変更になっため、VSにて再取り込みを行ったが、「○○_Result1.cs」というように、クラス名及びソースファイル名の最後に連番が付与したものが追加となってしまう。

■解決方法

一度、既存定義(VSではアクセスできない隠し情報あり)を消去してから、取り込み直す。
※ひょっとすると、私の知らない正しい方法があるかもしれません。ご存知の方はコメント願います。


■ダメなやり方

●「○○_Result.cs」を直接修正して項目を追加しても、マッピングが直っていないので・・・

●通常の手順(と、思われる)

 ・「ソリューションエクスプローラ」から「○○Model.edmx」ファイルを選択
  →「エンティティデザイナー」が表示される。

 ・「エンティティデザイナー」上で右クリックし「データベースからモデルを更新」を選択
  →「更新ウィザード」が開く

 ・「更新」タブを選択し、該当の関数を選択して[完了]ボタンをクリック
  →「出力」ウィンドウに
   生成されたモデル ファイル: ○○Model.edmx。
   データベースからのメタデータの読み込みに要した時間: 00:00:05.4409359。
   モデルの生成に要した時間: 00:00:04.2694248。
   と、出力される。

 ・ここで一度[すべてを保存(Ctrl+Shift+S)](VS のソリューション全体を保存するコマンド。
  VS上部のフロッピーディスク(!)が2枚のアイコン)にて、ソリューション全体を保存する。

  ※「このファイルはソースエディター以外で更新それました。再度読み込みますか?」
   と、聞かれた場合には[すべてに適用]ボタンをクリック。

 ・「ソリューションエクスプローラ」から該当関数の「○○_Result.cs」を選択
  ★なんと、直っていない!!なぜ??

●一度削除してやり直し

 ・「ソリューションエクスプローラ」から「○○Model.edmx」ファイルを選択
  →「エンティティデザイナー」が表示される。

 ・「ソリューションエクスプローラ」下部のタブから「モデルブラウザー」タブを選択
  ※「モデルブラウザー」タブがない場合「エンティティデザイナー」を右クリックして「モデルブラウザー」を選択

 ・「○○Model」→「関数インポート」を開き該当関数を右クリックして「モデルから削除」を選択

 ・「○○Model.Store」→「ストアドプロシージャ/関数」を開き該当関数を右クリックして「モデルから削除」を選択

 ・「ソリューションエクスプローラ」タブをクリックして「ソリューションエクスプローラ」に戻る

 ・該当関数の「○○_Result.cs」を右クリックして「削除」を選択(実際の「○○_Result.cs」ファイルも削除される。
  →『'○○_Result.cs'は完全に削除されます。』が表示されたら[OK]ボタンクリック

 ★念のためここで一度[すべてを保存(Ctrl+Shift+S)]にてソリューション全体を保存する。
  →消したはずの「○○_Result.cs」ファイルが現れる。(実際の「○○_Result.cs」ファイルも自動生成される。

 ★試しにこの状態で「○○Model.edmx」の「エンティティデザイナー」上で右クリックし「データベースからモデルを更新」を選択
  →「追加」タブを選択。「ストアドプロシージャと関数」→「dbo」→該当関数にチェックを入れて[完了]ボタンをクリック
   ※「モデルブラウザー」で該当関数を消す前は、「追加」タブの一覧に該当関数は表示されない。
   ※逆に「モデルブラウザー」で該当関数を消すと、「更新」タブの一覧に該当関数は表示されない。
  →「出力」ウィンドウにモデルが生成された旨が出力される。

 ★元の「○○_Result.cs」が残ったまま、「○○_Result1.cs」が作成されている。
  ※上記で[すべてを保存(Ctrl+Shift+S)]を実施せずに「追加」処理をしても同じ結果となる。

 ★「○○_Result1.cs」を開くとクラス名も「○○_Result1」になっている。
  ※諦めて「○○_Result.cs」ファイルを削除して、プロジェクト内の「○○_Result」クラスを使用している箇所を
   全て「○○_Result1」に変更すれば、動くことは動く。
  ※「○○_Result.cs」ファイルを削除して、「○○_Result1.cs」を修正してクラス名を「○○_Result1」から「○○_Result」
   に修正しても動く。
  ※ただし「○○_Result1.cs」というファイル名を変更することは出来ないもよう。

●裏ワザ的な方法

 ・上記を参考にして「モデルブラウザー」から該当関数を削除(2箇所)する。

 ・一度[すべてを保存(Ctrl+Shift+S)]にてソリューション全体を保存する。

 ・「ソリューションエクスプローラ」から該当関数の「○○_Result.cs」を削除。
  ※「○○_Result1.cs」「○○_Result2.cs」・・・がある場合には全て削除する。
  ※この状態で[すべてを保存(Ctrl+Shift+S)]しても、「○○_Result.cs」ファイルは自動生成されない。

 ★「ソリューションエクスプローラ」から「○○Model.edmx」ファイルを【右】クリック
  →「ファイルを開くアプリケーションの選択」を選択し、「XML(テキスト)エディター」を選択し[OK]ボタンクリック
  ※「ドキュメント・・・は既に開いています。このドキュメントを閉じますか?」が表示されたら[はい]ボタンクリック

 ★『_Result』にて「現在のドキュメント」内を検索して、

 ★『<edmx:ConceptualModels>』セクション内の、該当関数の『<ComplexType Name="○○_Result">』セクションを削除
  ※セクション内の<Property ...>なども含めて、セクション全体を削除する。

 ★さらに下の方の『 <ComplexType Name="○○_Result">』セクション(○○_Result1...などがあれば全て)を削除

 ★「Models\○○Model.edmx の保存(Ctrl+S)」ボタン(フロッピーディスクが1枚のアイコン)にて該当ファイルのみ保存
  「○○Model.edmx」タブの[×]ボタンクリックにて、「XML(テキスト)エディター」を閉じる。

 ※念のため[すべてを保存(Ctrl+Shift+S)]。「○○_Result.cs」ファイルは自動生成されない。

 ★「ソリューションエクスプローラ」から「○○Model.edmx」ファイルを選択し直し、「エンティティデザイナー」を表示
 ・右クリックメニューから「データベースからモデルを更新」を選択
 ・「追加」タブ→「ストアドプロシージャと関数」→「dbo」→該当関数にチェックを入れて、[完了]ボタンクリック

 ★[すべてを保存(Ctrl+Shift+S)]ボタンクリック→該当関数の「○○_Result.cs」ファイルが自動生成される。
 ・「○○_Result.cs」ファイルを開くと、クラス名もちゃんと「○○_Result」になっている。

■インデックス
MVC5データベースファーストでちゃっちゃとモバイルサイト
1.MVC5 データベースファースト テーブル値関数の使用方法
2.MVC5 複数項目あるモデルの定義
3.MVC5 ビューでの数値項目右寄せカンマ編集
4.MVC5 BootStrap でのアコーディオン
5.MVC5 データベースファースト ASP.NET Identity に嵌る
6.MVC5 テーブル値関数の再取り込み方法
7.MVC5 Session情報に配列を記録する方法
8.MVC5 AWS へのアップロード方法
9.SQL Server 読み込み専用ユーザの設定方法
10.MVC5 セッションタイムアウト後にLogin画面に戻す方法
11.自己認証による https化
12.LinQ の遅延実行に泣く



コメント ( 0 ) | Trackback ( 0 )