2009-06-21 26 views
6

3つのテーブルがあります。私はADO.NET Entity Frameworkでストアドプロシージャを記述します。私は、ストアドプロシージャの機能を必要ADO.NET Entity Frameworkでストアドプロシージャを使用する方法

ALTER PROCEDURE [dbo].[sp_GetDepartmanData] 
(@departman nvarchar(50)) 
BEGIN 
    SELECT 
    d.ID, d.Name as DepartmanName, 
    sb.Salary, sb.email, 
    sp.Name, sp.SurName, sp.Phone, sp.Married, sp.Address 
    FROM   
    Departman d 
    INNER JOIN StaffsBusiness sb ON d.ID = sb.StaffsPersonelDepartmanID 
    INNER JOIN StaffsPersonel sp ON sb.StaffsPersonelID = sp.ID 
    WHERE 
    d.Name = @departman 
END 

Iは、以下の書き込み:

var staffPersonel = staffContext.GetPersonelInformationWithDepartmanID("Yazılım"); 

gvPersonel.DataSource = staffPersonel; 
gvPersonel.DataBind(); 

GetPersonelInformationWithDepartmanID機能は、私はSQL(ADO.NET Entity Frameworkの内のユーザ定義関数)3、代替があり(それからの書き込み愚かな!!!))しかし、私は3つのjoininigテーブルを持っている!前に3つのテーブルに参加するとどうすれば使えますか?

答えて

6

さて、あなたはここでいくつかの手順が必要になります。余談として

  • は、あなたのEntity Frameworkのモデル (にあなたのストアドプロシージャsp_GetDepartmanDataを追加する - それはだが、強くであるあなたのストアドプロシージャを呼び出すためにをしないことをお勧めしますsp_(something) - sp_接頭辞の使用はMicrosoftのみのシステムストアドプロシージャ用に予約されています)
  • ストアドプロシージャがデータセットを返すので、最初に概念エンティティを作成してからca nあなたのストアドプロシージャを使用します。エンティティデザイナで、新しいエンティティを作成し、DepartmentDataEntityTypeまたは何かのような有益な名前を付けます。ストアドプロシージャから返されるすべてのフィールドをそのエンティティタイプ
  • に追加すると、エンティティデータモデルで関数インポートを作成できます。モデルブラウザに移動し、 "model.store"セクションに移動します。ストアドプロシージャに移動します
  • オブジェクトコンテキストで関数に名前を付け、それが返すものを定義することができます - この場合は、新しく作成されたエンティティタイプを選択してください(例:DepartmentDataEntityType上から)
  • あなたは完了です!

あなたは今のような関数インポート何か持っている必要があります:あなたのオブジェクトコンテキストに

public global::System.Data.Objects.ObjectResult<DepartmentDataEntityType> GetPersonelInformationWithDepartmanID(global::System.String departmentName) 
{ 
    global::System.Data.Objects.ObjectParameter departmentNameParameter; 

    departmentNameParameter = new global::System.Data.Objects.ObjectParameter("departmentNameParameter", departmentName); 

    return base.ExecuteFunction<DepartmentDataEntityType>("sp_GetDepartmanData", departmentNameParameter); 
} 

この関数は、現在お使いのデータベースからストアドプロシージャを介してデータを取得するために呼び出すことができます。

マルク・

編集:

マッピング・エラー(「エラー3027:次のEntitySet/AssociationSetのために指定されていませんマッピング」)になっている場合はこれをやった後、エンティティが作成したので、それはです何にもマッピングされておらず、関数のインポートによってこれらのエンティティのコレクションが生成された場合にのみ使用されます。このエンティティを何とかデータストアにマップするか、複雑なタイプに変更する必要があります。

複雑なタイプを作成するには、単にEFデザイナを開き、空の領域を右クリックします。 [追加]> [複合タイプ]に移動します。モデルブラウザに新しい複合タイプが表示されるはずです。右クリックし、エンティティにプロパティを追加したのと同様のスカラープロパティを追加します。次に、エンティティを削除し、複合型の名前をエンティティと同じ名前に変更します。

これだけです。:)

+0

こんにちはマルク。あなたの指示に従ってみましたが、ここではPOCOセットアップをしても機能しません。デザイナーがクラスを作成できるようにすると、これが動作します。POCOでこれを行う方法を知っていますか? –

+0

@ Pure.Krome:いいえ、申し訳ありませんが、私は実際にEF4 POCOで何もしていないので、本当に言うことはできません.... –

+0

これは動作しますが、エラーリストに永続エラーays "エラー3027:次のEntitySet/AssociationSetにマッピングが指定されていません"。このエラーを解決するには何が必要ですか? – Chev

1

「概念エンティティ」はどのように作成しますか? 私は私にマップされていないエンティティを作成した場合、次のエラーを取得:「エンティティタイプ 『foobarに』がデータベースにマップされていない

+0

私もこのエラーが発生しています...私が知ることは、3月に4.0が出るまで修正するつもりはない1.0バグです。 https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=378518&wa=wsignin1.0 –

+0

バマー:(私はVS2010を使用していますが、私はまだこの問題を抱えています。バグは「修正済み」です。WTF :(qq :( –

関連する問題