web-dev-qa-db-ja.com

EF 6データベース最初:ストアドプロシージャを更新する方法?

Entity Framework 6.0. を使用し、最初にデータベースを使用します (このように) テーブルとストアドプロシージャからコードを生成します。これは、モデルを更新または更新するときにストアドプロシージャの変更が反映されないことを除いて、うまく機能しているようです。テーブルへの列の追加は反映されますが、ストアドプロシージャへのフィールドの追加は反映されません。

Model Browserに移動して、ストアドプロシージャを右クリックし、Add Function Importを選択してGet Column Informationボタンをクリックすると、正しい列が表示されます。つまり、モデルは列を認識していますが、生成されたコードを更新することはできません。

1つの回避策があります。それは、モデルを更新する前に、生成されたストアドプロシージャを削除することです。これは、ストアドプロシージャを編集していない限り機能します。誰でもこの回避策を回避する方法を知っていますか?

2013年12月上旬現在のすべての最新アップデートでVisual Studio 2013を使用しています。

前もって感謝します!

更新1:andersrの答えは、ストアドプロシージャが一時テーブルを使用した1つの場合に役立ちましたので、私は彼に+1を与えましたが、それでも解決しません単純なストアドプロシージャを更新する主な問題。

更新2:以下のシムロンのコメントは、EF 3.5の同じ問題に関する質問へのリンクです。 EF 6.0でも同じことが当てはまるようです。別の方法でそれを読んでください。しかし、現時点での私の結論は、それを行う最も簡単な方法は、モデルを更新する前に生成されたストアドプロシージャを削除することです。凝った何かをしたい場合は、部分クラスを使用します。

45
Halvard

この回答 by DaveD に基づいて、これらの手順は問題に対処します:

  1. あなたの.edmx、rt-クリックしてModel Browserを選択します。
  2. モデルブラウザー(VS 2015の既定の構成では、ソリューションエクスプローラー内のタブ)で、モデルの下のFunction Importsを展開します。
  3. ストアドプロシージャをダブルクリックします。
  4. Updateボタンの横にあるReturns a Collection Of-Complex(ifスカラーまたはエンティティを返さない)
  5. okayをクリックしてから、save.edmxにフィールドの変更を保存しプロジェクト全体の手順。
98
Rick V

ストアドプロシージャは一時テーブルからデータを返しますか? EFはこれをサポートしていないようです。詳細については、 EF4-選択したストアドプロシージャは列を返しません を参照してください。

ただし、ストアドプロシージャは、モデルブラウザーで使用できるようになります。上記のシナリオを使用した簡単なテストを行いました。 ストアドプロシージャはコンテキストクラスで生成されましたが、戻り値の型は複雑な型ではなくintでした。潜在的な回避策については、上記のリンクを参照してください。

2
andersr

私はこれに遭遇し、私の回避策(本当に厄介です)は、データ型への明示的なキャストを伴うクエリと同じ出力リストを選択するストアドプロシージャの先頭で決して真ではない条件を持つifステートメントを作成することでした戻りたい。これは、型がNULL値を許容することを前提としているため、キャストをISNULLでラップすることを解決するために

たとえば、出力に列がある場合:

UserId (int, not null)
RoleId (int, nullable)
FirstName (varchar(255), nullable)
Created (datetime, not null)

これにより、次のようなPOCOが作成されます。

SomeClass {
    public int UserId { get; set; }
    public int? RoleId { get; set; }
    public string FirstName { get; set; }
    public DateTime Created { get; set; }
}

...しかし、そうではないため、今日ここに来ています。この問題を回避するために、SP( 'AS'の直後))の先頭に以下を追加しました:

if(1=0)
begin
    select
        UserId = isnull((cast(0 as int)),0),
        RoleId = cast(0 as int),
        FirstName = cast(0 as varchar),
        DateTime = isnull((cast(0 as datetime)),'')
end

それは恐ろしくていですが、毎回私にとってはうまくいきます。すぐにこれを解決するツールの更新を取得することを望みます... SQL Server 2016 w/VS2015に一時テーブルがなく、今日私に起こりました...

これが誰かを助けることを願っています

0