2012-04-13 18 views
12

私は過去数日間インターネットを介して私の質問と同様のトピックを探しました。私はついに自分自身でこの質問をしました。Entity Frameworkストアドプロシージャの結果のマッピング

コードファーストの方法論とEF 4.3.1を使用して、ストアドプロシージャの出力を格納するコンテキストクラス、エンティティクラス、およびクラスを作成しました。コンテキストクラスには、SqlQuery<T>を使用して特定のストアドプロシージャを実行するメソッドがあります。

例:

public IEnumerable<Results> GetData(int id) 
{ 
    var parameters = new SqlParameter[] { new SqlParameter("@id", id) }; 
    var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id", parameters); 
    var data= result.ToList<Result>(); 

    return data; 
} 

私は私のデータ私のデバッグをトレースしていたように戻った、とデータが一致する名前を持つプロパティにマッピングされています。ただし、出力には名前に"/"の列があります(例:Info/Data)。 []でテキストをラップする、

[Column("Info/Data")] 
public string InfoData 
{ 
    get { return infoData; } 
    set { infoData= value; } 
} 

私もそのまま演算子([Column(@"Info/Data")])を使用してみました(:私は、列の属性([Column("Info/Data")])を使用して出力をマップすることができ考え出しので、もちろん、私はそのようなプロパティを指定することはできません[Column("[Info/Data]")])、私は両方を試しました([Column(@"[Info/Data]")])。コードをステップ実行すると、一致する列名のプロパティが割り当てられますが、列属性のプロパティは無視され、割り当て中にステップオーバーされます。

また、実体のすべての列に対してfluent-apiを試しました。

modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data"); 

それは次の例外をスロー:

データリーダが指定 'NameSpace.Result' と互換性がありません。型 'InfoData'のメンバには、同じ名前のデータリーダーに対応する列がありません。私のプロジェクトNameSpace.Result

(対応するSQL列がその中に/を持っています。例:情報/データ)クラスである(名前はセキュリティのために変更)とInfoDataisは、私は流暢-APIを使用してマップしよう性質であります。

誰もこの問題に遭遇しましたか?

私の問題が明確でない場合や、事前に尋ねられた場合は、事前にお知らせください。

+7

私はどのような人の名前 "/"キャラクター。 –

+0

それは私たちの2つを作る。私はprocを書かなかった。私はそのデータを使用するように言われました。エイリアシングが起こっているのを見るのは非常にうんざりでした。 –

+0

結果に通常の列名を持つラッパーSPを作成する可能性はありますか? – vittore

答えて

3

これは以前の質問ですが、OPの最近の回答ではうんざりしているので、おそらくまだ興味があります。

ストアドプロシージャをそのまま使用していて、EFと互換性のない列名を返す場合は、SQLを渡してproc directをSqlQueryと呼んでいるのを見て、INSERT-EXECメソッドを使用してテーブル変数(より互換性のある列名を持つ)を宣言するか、格納されたprocをテーブル変数にINSERT-EXECした後、結果セットとしてテーブル変数から選択しますか?

私は長年にわたってSQLを渡していましたので、私は美味しい解決策にはなりませんでしたが、それが問題を回避する方法であるかどうかを確認するための練習として、私はそれを提案しました。 - ストアドプロシージャを変更できなかったため(ほとんどの場合、db構造にアクセスすることがほとんどないか、変更を加えている可能性があるので、ほとんどの方法は役に立ちません) ?)、しかし、INSERT-EXECメソッドは、dbレベルで何かを変更する必要なしに可能な回避策としてポップアウト...

+0

私は完全にそれについて読んだと実際にそれを使用していないとして私は完全にインサート - Execを忘れていた。私の答えと同じように、OPENROWSETを使うよりはるかに良い解決策です。これは間違った形の列名をマスクすることができるので、確かに可能な解決策の1つです。 –

0

あなたがしたいことはできない場合があります。 Raw SQLを使用すると、EFのマッピング部分がバイパスされます。 ExecuteStoreQuery http://social.msdn.microsoft.com/Forums/pl/adonetefx/thread/d524b005-12a4-4300-a974-1e0582de876b

How to use Entity Framework to map results of a stored procedure to entity with differently named parameters

同じことあなたはDbDataRecordオブジェクトのリストを取得するためにObjectQueryを使用することができます。次に、Linqの "Select"関数を使用して結果をオブジェクトタイプにマッピングします。 IEnumerableをとり、IEnumberableを返す拡張関数でそのマッピングをラップするとします。最も簡単な(潜在的にクリーンまたは最善の解決策ではない)の

Return Custom Object <List T> from Entity framework and assign to Object Data Source

+0

私はコードファーストプロジェクトを終了し、このインスタンスでデザイナーと一緒に行きました。マッピングのサポートがストアドプロシージャコールになるまで、この方法をそのまま使用します。ありがとうございました –

0

戻ってこの問題を考える一つは、新たな手順で結果セット全体をラップすることです。もちろん、最善の解決策であることを何も壊さずにプロシージャを変更する能力があれば。ただし、出力を変更できない場合は、OPENROWSET(Aaronの答えを見てください)を使用して、プロシージャの出力をテーブルに取り込み、新しいエイリアスを持つ各列を選択して、よりクリーンなプログラミング原則に従います。

今後誰にでも役立つことを願っています。

注:
EFの新バージョンは、この問題を解決したかどうかは確認されていませんでした。

関連する問題