ADO.NET Entity Frameworkのストアドプロシージャを使用する方法

.net c# entity-framework linq

質問

私は3つのテーブルを持っています。私は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

以下に書くストアドプロシージャ関数が必要です。

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

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

GetPersonelInformationWithDepartmanID関数SQL(ADO.NET Entity Frameworkのユーザー定義関数)から書くと3つの選択肢があります(それは愚かです!!!)しかし私は3つのjoininigテーブルを持っています!!!以前に3つのテーブルを結合した場合、どのように使用できますか?

受け入れられた回答

さて、ここでいくつかの手順が必要です。

  • あなたのEntity Frameworkモデルにあなたのストアドプロシージャsp_GetDepartmanDataを追加する(さておき - あなたのストアドプロシージャsp_GetDepartmanData sp_(something)を呼び出さないことを強くお勧めします - sp_接頭辞の使用はMicrosoft専用システムストアドプロシージャのために予約されています)
  • ストアドプロシージャは一連のデータを返すので、ストアドプロシージャを使用する前に、まず概念的なエンティティを作成する必要があります。 Entity Designerで、新しいエンティティを作成し、 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);
}

オブジェクトコンテキストのこの関数は、データベースからストアドプロシージャを介してデータを取得するために呼び出すことができます。

マーク

編集する

これを実行した後にマッピングエラー( "Error 3027:次のEntitySet / AssociationSetにマッピングが指定されていません")が発生した場合は、作成したエンティティが何にもマッピングされていないためです。これらのエンティティの。このエンティティを何らかの方法でデータストアにマップする必要があるか、またはそれを複合型に変更する必要があります。

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

それがあなたがしなければならないすべてです:)


人気のある回答

この「概念上の実体」をどのように作成しますか。にマッピングされていないエンティティを作成すると、次のエラーが発生します。 "エンティティタイプ 'foobar'はデータベースにマッピングされていません。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ