2011-10-31 11 views
5

シナリオ 私はEntity Framework 4.1でVisual Studio 2010を使用しています 多くのテーブルと多くのストアドプロシージャを持つ従来のデータベースがあります。 MVC 3を使用してASP.NET C#プログラムを作成しています。エンティティフレームワークで選択ストアドプロシージャをマッピングする

ADO.NET DbContextを使用して「データベースファースト」デザインを採用していますので、すべてのモデルとアソシエーションとナビゲーションプロパティをきちんと設定したedmxがあります。 私は、挿入、更新、削除の手順を関連するモデルにマップできます。 私は他のストアドプロシージャをインポートするために「関数インポート」を使用しました。 しかし、Selectプロシージャを選択アクション(id、selectリスト、filterで選択など)にマップする方法が見つかりません。

EFは遅延読み込みを使用しているように見えますが、オブジェクトが子オブジェクトをフェッチするときに、既に書き込まれたストアドプロシージャが使用されます。 (選択手順は、アカウントに「IsDeleted」フラグを取り、そしてとりわけ句、「BY ORDER」を使用)

私は http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx この記事から参照SQLにLINQのは、SPののドラッグ&ドロップを可能にする、その音、多かれ少なかれ、まさに私が欲しいものです。

私はまた、DefiningQueryという言葉に出会った。 http://msdn.microsoft.com/en-us/library/cc982038.aspx これは私が欲しいものですか? 「モデルの更新ウィザードを実行すると、クエリの定義を含む、ストレージモデルに加えられた変更はすべて上書きされます」というメモは気に入らない

要約すると、オブジェクトが自分のストアドプロシージャを使用する子オブジェクトをフェッチするとき、私は何をしたいのですか。

私はEntity Frameworkを使用して目標を達成できますか? 明白な何かを忘れましたか?

あるいは、例えば、私の生成されたアドレスのモデルは、このプロパティを持っているように、私は、本当に賢いこととDBエンティティT4テンプレートを変更しようとする必要があります:

GetAddressLinesは関数を呼び出すカスタム関数である
public virtual ICollection<AddressLine> AddressLines { 
    get{ 
     DBWrapper _db = new DBWrapper(); 
     return _db.GetAddressLines(AddressID); 
    } 
    set{}; 
} 

インポートし、必要な変換を行います。

答えて

6

これはできません。ストアドプロシージャを関数のインポートとしてインポートして手動で実行することはできますが、EFによって生成されたクエリをカスタムストアドプロシージャに置き換えることはできません。

+0

ありがとう:ジュリー・ラーマンの記事を参照してください。それは私が疑うものを確認する – Webbie4

2

あなたがそうすることを除いて、並べ替えます。

"select * from mytable"に最も近い選択ストアドプロシージャを使用し、それを使用してデータベース内のビューを定義します。エンティティフレームワークに "mytable"の代わりに "myview"

最後に、選択した選択項目に関数のインポートを使用し、エンティティのコレクションを返すように関数のインポートを定義します。もしあなたがPersonエンティティのようなものを持っていて、FetchPersonByAge(int)のようなストアドプロシージャを持っていたら、エンティティは "GetByAge(int)"のような静的メソッドで終わるでしょう。このようなコード:var people33 = Person。getByAge(33);

私はこれを行っていて、かなりうまくいっています。レガシーデータベースのデザイナーは、すべてのデータベースへのアクセスにストアドプロシージャを使用し、テーブルに直接アクセスするユーザーコードは必要ありません。

http://msdn.microsoft.com/en-us/data/gg699321.aspx

デイブ

関連する問題