web-dev-qa-db-ja.com

エンティティフレームワーク3.5のストアドプロシージャの更新

エンティティフレームワークで.NET 3.5 SP1、VS 2008を使用しています。最初に、2つのパラメーターを使用するストアドプロシージャをモデルに追加しました。後で、sprocを変更して1つのパラメーターのみを取得しました。 Update Model From Databaseメニューオプションを使用して、sprocがRefreshタブにリストされていることを確認しました。ウィザードを終了し、ソリューションをクリーンアップして再構築しましたが、モデルはsprocのシグネチャを変更しませんでした。

なぜ更新されないのですか?データベースからのモデルの更新機能は壊れていますか?何か不足していますか?ありがとう。

54
Jeff

エンティティフレームワークにストアドプロシージャを追加した後、ストアドプロシージャを更新すると、2つの問題が発生しました。

  • SPROCを呼び出すために作成された関数インポートは更新されませんでした(誤った、古いパラメーター)
  • SPROCの結果セット用に作成された複合型は更新されませんでした(誤った、古いフィールド)

EDMXモデルの更新(関数インポート)

  1. (GUIデザイナーで).edmxファイルを開きます。
  2. 空きスペースを右クリックして、「データベースからモデルを更新」を選択します。
  3. ポップアップウィンドウで[完了]をクリックします(可能な場合)。 SPROCの署名を(関数のインポートとともに)更新する必要があります。

ストアドプロシージャの複合型の更新

  1. .edmxを開いているときに、「Model Browser」ウィンドウを開きます。

  2. ContentModelEntityContainer:...、次にFunction Importsノードを展開します。ストアドプロシージャの関数インポートを探し、ダブルクリック it。作成に使用したのと同じウィンドウが開きますが、データが表示されます。

  3. 列情報の取得ボタンをクリックします(ボタンの下のグリッドを見て、変更内容を確認します)。

  4. [複雑]ラジオボタンの選択肢の横にある[更新]ボタンをクリックします。

  5. [〜#〜] ok [〜#〜]をクリックすると、結果セットの複合型が更新されます。

134
DaveD

Edmx/xmlを編集する必要はありません。これを行う:

ストアドプロシージャをEDMXに持ち込むと(結果セットを返すものについて話しますが、同様のプロセスになります)、1ではなく3のアイテムが作成され、それが問題の原因です。 (***問題の2番目の原因は、オブジェクトを削除した後、オブジェクトを再インポートする前に明示的に保存する必要があることです。さもないと、新しく再インポートされたオブジェクトは、edmxから(保存によって)本当に削除されていないものと衝突します。

そう!これを行う:

通常はモデルブラウザーの左側で、ストアドプロシージャの名前を検索ボックスに貼り付け、Enter(または検索)をクリックします。最初のインスタンス-おそらくストアドプロシージャ自体に到達します。右クリックして削除します。次に、カーソルを検索ボックスに戻します-> Enterキーを押すか、もう一度検索します。これで、関数のインポートに着手します。右クリックして削除します。同じことを3回行います。これにより、結果セットを表す複合型に到達します。消して。これで完了です!!!!!。削除がedmxに書き込まれる(書き込まれない)ように、実行した内容を保存する必要があります。

次に、ストアドプロシージャを再度取得します(モデルの更新/ストアドプロシージャの選択)。もう一度クリックして保存します。

それは毎回機能します。重要なのは、モデルブラウザを使用してモデルブラウザに表示されるストアドプロシージャ名のすべてのインスタンスを検索するときの確認です。そのため、デフォルトの命名規則に煩わされない方がよいでしょう。 2番目のキーは、ステップを完了した後に保存することです。

13
jamescnectnet

結果セットの列のデータ型を変更する必要がある場合-> stor procの先頭でset fmtonly off

次に、[モデルブラウザー]-> [関数のインポート]-> [プロセスの編集]-> [列情報の取得]ボタン-> [更新]ボタンを使用します。

これがニールのやり方です:)

6
alex

ストアドプロシージャのシグネチャを変更する場合は、関数インポートを介してモデルで作成されたすべての複合型を更新する必要があります。

1
kram

XMLを手動で編集し、Visual Studioを数回再起動する必要がありましたが、VSに以前の署名を忘れさせることができました。次に、通常のEFウィザードを使用して追加し直したところ、うまく機能しました。

1
Jeff

次の場所でSPのすべての証拠を消去することもできます。これらのファイルは、.edmxファイルを開いたときにモデルブラウザーで見つけることができます。

  • YourModel>複合型;
  • YourModel>関数のインポート;
  • YourModel.Store>ストアドプロシージャ/関数。

削除した後、問題なく追加できます。

0
Terkhos

個々のspを更新するオプションがないEF4で同様の問題があった場合、更新ウィザードで[更新]をクリックしたときに行うことを意図していますが、確実に動作しません。モデルブラウザーで、戻り値の複合型と関数のインポートを削除する必要がありました。次に、XMLエディターでedmxファイルに移動し、ストアドプロシージャへの参照を削除します(モデルブラウザーでこれを行う方法が見つかりませんでした)。次に、SPSを再度追加します。

0
Rob Sedgwick

エンティティフレームワークでプロシージャの新しい定義を生成する必要があるため、ストアドプロシージャを削除して追加し直す必要があります。関数のインポートをやり直す必要があると思います。

基本的に、戻り値の型や署名ではなくプロシージャのロジックを変更した場合は、再度追加する必要はありません。正常に機能しますが、戻り値の型または署名を変更する場合、efはそれを生成し、動作する新しい定義にマップする必要があります。

0
Vishal