2011-07-14 31 views
9

SQL Serverに接続しているEntity Framework 4.1を使用してPOCOクラスを生成するDBを取得しました。私は '関数のインポート'機能を使用して、結果の行を呼び出して呼び出しを作成するストアドプロシージャもあります。基本的に私が使用しているプロセスがにある: Entity Frameworkで生成された複合型の変更を反映する

  • 「...関数のインポート」を

    1. 右クリックModel.edmxに選択します私の希望関数インポートを入力し、ドロップダウン
    2. から手順を選択
    3. クリックして名前を付け
    4. を "カラム情報の取得" をクリックし
    5. を "新しい複合型を作成" をクリックして "OK"

    は、それが結果セットの定義のためのPOCOクラスを作成し、私は何かのように行うことができます。

    var query = context.GetMyStuff().AsQueryable();

    は結果を取得します。これはうまくいくようです。

    私が抱えている問題は、ストアドプロシージャを変更してから、自分のコードに変更を反映させるときです。たとえば、テーブルに追加の列を追加し、結果の一部として列データを返すようにストアドプロシージャを更新しました。その更新を関数のインポートに伝播する方法、つまり、生成されたPOCOにその追加された列の新しいプロパティを持たせる方法はありません。

    プロシージャの更新を行うドリルは、C#側に反映されますか?毎回新しいクラスを作る必要がありますか?私にはこれをどうやって行うのか分かりませんでした。


    追加情報:

    this questionにラディスラフによる応答で提案されているように私は、「更新」するために複雑なタイプを試してみたとき、私は「エラーメッセージが表示されますFunctionImport名が一意であることを確認します"

    私は何を試してください。 Brennanが以下に示唆するように、私は同じエラーメッセージを受け取ります。作業を何

    は、少なくとも私にとっては、メモ帳++でModel.edmxファイルを開くFunctionImportラインを見つけ、それを再生成し、それを削除することです。それは理想的ではありませんが、効果はあります。

  • +0

    これは同じ質問かどうか分かりません:http://stackoverflow.com/questions/6381423/function-import-when-sp-is-changed –

    +0

    @Ladislav - それを見ましたが、私が試してみるとそれは私がエラーを取得しますか。私はそれを反映するため上記の質問を編集します。 – itsmatt

    答えて

    9

    通常は、メインメニューで[表示]> [その他のWindows]> [エンティティデータモデルブラウザ](通常はソリューションエクスプローラと同じパネルで開きます)を選択し、変更されたストアドプロシージャを削除し、それを再び追加してください。

    これは簡単かもしれませんが、これは私のために働きます。

    編集: "データベースからモデルを更新する"理論的にも動作するはずですが、私の経験上、100%の時間は動作しません。削除と再追加は堅実に見えます。

    +0

    応答してくれてありがとう - これを試してみましたが、私の質問の最後に私の追加の注釈を入れたのと同じ問題がありました。 .edmxファイルを直接編集して(xml、それです)、私が更新しようとしているもの(FunctionImport行)を削除しても動作しますが、これはちょっと大変です。 – itsmatt

    +0

    モデルブラウザを使用していたときに、ストアドプロシージャを削除して関数のインポートを削除しましたか?2つの別々の削除?それはエラーなしで私のために働く - ちょうどそれを確認した。 –

    +0

    私は、関数のインポートを削除し、その後、保存されたprocを削除し、データベースからの更新を行って、削除されたストアドプロシージャを返しました。モデルを右クリックしました。私の希望する関数のインポート名を再入力し、ドロップダウンからストアドプロシージャを選択し、カラムをクリックしてボタンをクリックし、「新しい複合タイプを作成」をクリックして、MyFuncImportName_Resultの複合タイプ名を与え、OKをクリックし、 "FunctionImport名が一意であることを確認してください。"ダイアログ。 model.edmxにまだエントリがあるように見えます。xmlから手動で削除すると、それが動作します。 – itsmatt

    1

    @itsmatt - あなたのソリューションは私のために働いた。要するに、

    1. テキストエディタでファイル.edmxを開きます。
    2. 見つけて削除するように見えるXMLノード:
    <FunctionImport Name="<some name>" ReturnType="Collection(dev_riskModel.GetECLExcesses_Result)"> 
    (additional lines. . .) 
    </FunctionImport> 
    
    1. 保存にモデルブラウザでファイル
    2. を、データベースからモデルを更新、再追加などストアドプロシージャ
    3. コンテキストメニューからアイテム「関数インポートの追加」を選択し、新しく追加されたストアドプロシージャを選択し、
    1

    私はこの同じ問題に直面し、あなたの答えをありがとう!私がしなければならなかったもう1つのことは、モデルブラウザの "複合型"から出力を削除することでした。

    +0

    それは答えではなく、コメントであったはずです。私はあなたがコメントするためにはもっと多くの担当者が必要であることを知っ – bummi

    26

    (このソリューションは、私は他のEFのバージョンで試していないEF 6のためである。それは素敵な作品。)私は私のような素朴なプログラマーにそれをより明確にするために例を示すことにより、ブレナンの答えをサポートしています:)


    行くのブラウザをモデル化します。 MyStoreProcはストアドプロシージャの名前です(例として)。 MyStoreProcは3か所に表示されます。アンダー

    1. 第一place-コンプレックスの各種タイプ - >関数の輸入の下でMyStoreProc_result
    2. 第二Place-として - ストアド Procdures /関数の下で - - >などMyStoreProc
    3. 3位>などMyStoreProc enter image description here

    モデルから3つすべてを削除します。 edmxを保存します(ウィンドウをクリックしてからCtrl + Sキーを押す)。次に、右クリックし、データベースからモデルを更新をクリックします。次に、更新されたストアドプロシージャを追加し、再度保存します。任意の手間:)

    2

    弊社で我々はSPの動作しますが、ドラッグの一種であるSArifinの答えは...などを更新するために使用することなく、解決

    は最近、我々はあなたが唯一のそのSPの関数インポートに行くために持っていることが分かった - >右クリック - >編集 - >複合型を更新します。

    +0

    ありがとう、私は各SPの3つの別々のインスタンス(複雑なタイプのinc)を削除するために使用されましたが、あなたの提案は動作し、はるかに迅速です... – NickGPS

    関連する問題