エンティティフレームワークで.NET 3.5 SP1、VS 2008を使用しています。最初に、2つのパラメーターを使用するストアドプロシージャをモデルに追加しました。後で、sprocを変更して1つのパラメーターのみを取得しました。 Update Model From Database
メニューオプションを使用して、sprocがRefresh
タブにリストされていることを確認しました。ウィザードを終了し、ソリューションをクリーンアップして再構築しましたが、モデルはsprocのシグネチャを変更しませんでした。
なぜ更新されないのですか?データベースからのモデルの更新機能は壊れていますか?何か不足していますか?ありがとう。
エンティティフレームワークにストアドプロシージャを追加した後、ストアドプロシージャを更新すると、2つの問題が発生しました。
EDMXモデルの更新(関数インポート)
ストアドプロシージャの複合型の更新
.edmxを開いているときに、「Model Browser」ウィンドウを開きます。
ContentModel、EntityContainer:...、次にFunction Importsノードを展開します。ストアドプロシージャの関数インポートを探し、ダブルクリック it。作成に使用したのと同じウィンドウが開きますが、データが表示されます。
列情報の取得ボタンをクリックします(ボタンの下のグリッドを見て、変更内容を確認します)。
[複雑]ラジオボタンの選択肢の横にある[更新]ボタンをクリックします。
[〜#〜] ok [〜#〜]をクリックすると、結果セットの複合型が更新されます。
Edmx/xmlを編集する必要はありません。これを行う:
ストアドプロシージャをEDMXに持ち込むと(結果セットを返すものについて話しますが、同様のプロセスになります)、1ではなく3のアイテムが作成され、それが問題の原因です。 (***問題の2番目の原因は、オブジェクトを削除した後、オブジェクトを再インポートする前に明示的に保存する必要があることです。さもないと、新しく再インポートされたオブジェクトは、edmxから(保存によって)本当に削除されていないものと衝突します。
そう!これを行う:
通常はモデルブラウザーの左側で、ストアドプロシージャの名前を検索ボックスに貼り付け、Enter(または検索)をクリックします。最初のインスタンス-おそらくストアドプロシージャ自体に到達します。右クリックして削除します。次に、カーソルを検索ボックスに戻します-> Enterキーを押すか、もう一度検索します。これで、関数のインポートに着手します。右クリックして削除します。同じことを3回行います。これにより、結果セットを表す複合型に到達します。消して。これで完了です!!!!!。削除がedmxに書き込まれる(書き込まれない)ように、実行した内容を保存する必要があります。
次に、ストアドプロシージャを再度取得します(モデルの更新/ストアドプロシージャの選択)。もう一度クリックして保存します。
それは毎回機能します。重要なのは、モデルブラウザを使用してモデルブラウザに表示されるストアドプロシージャ名のすべてのインスタンスを検索するときの確認です。そのため、デフォルトの命名規則に煩わされない方がよいでしょう。 2番目のキーは、ステップを完了した後に保存することです。
結果セットの列のデータ型を変更する必要がある場合-> stor procの先頭でset fmtonly off
次に、[モデルブラウザー]-> [関数のインポート]-> [プロセスの編集]-> [列情報の取得]ボタン-> [更新]ボタンを使用します。
これがニールのやり方です:)
ストアドプロシージャのシグネチャを変更する場合は、関数インポートを介してモデルで作成されたすべての複合型を更新する必要があります。
XMLを手動で編集し、Visual Studioを数回再起動する必要がありましたが、VSに以前の署名を忘れさせることができました。次に、通常のEFウィザードを使用して追加し直したところ、うまく機能しました。
次の場所でSPのすべての証拠を消去することもできます。これらのファイルは、.edmxファイルを開いたときにモデルブラウザーで見つけることができます。
削除した後、問題なく追加できます。
個々のspを更新するオプションがないEF4で同様の問題があった場合、更新ウィザードで[更新]をクリックしたときに行うことを意図していますが、確実に動作しません。モデルブラウザーで、戻り値の複合型と関数のインポートを削除する必要がありました。次に、XMLエディターでedmxファイルに移動し、ストアドプロシージャへの参照を削除します(モデルブラウザーでこれを行う方法が見つかりませんでした)。次に、SPSを再度追加します。
エンティティフレームワークでプロシージャの新しい定義を生成する必要があるため、ストアドプロシージャを削除して追加し直す必要があります。関数のインポートをやり直す必要があると思います。
基本的に、戻り値の型や署名ではなくプロシージャのロジックを変更した場合は、再度追加する必要はありません。正常に機能しますが、戻り値の型または署名を変更する場合、efはそれを生成し、動作する新しい定義にマップする必要があります。