2012-10-21 8 views
5

Entity Frameworkを使用してSQL Serverのストアドプロシージャを呼び出し、結果セットをブラウザに返すWCFサービスを作成したいとします。Entity Frameworkを使用してストアドプロシージャを呼び出し、WCFから安心して戻るためのより良い方法はありますか?

EFで関数importを使用してストアドプロシージャをインポートし、複合型を作成しました。

EFの複合型は、シリアル化されずに黙って返されないようです。私がこの作業をした唯一の方法は、具体的なクラスを作成し、EFから返された複合型から構築することです。これは動作しますが、30個のストアドプロシージャがあれば、30個の具体的なクラスを作成する必要がありますが、これはやや苦痛です。

これを行うより良い方法はありますか?

WCFの契約:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract,WebGet,XmlSerializerFormat] 
    List<People> usp_GetPeople();  
} 

コンクリートクラスは、すべての手続きのために作成される必要があるでしょう:

public class People 
{ 
    public int person_id; 
    public string last_name; 
    public string first_name; 
    public string street_addr; 
    public string state_code; 
    public string postal_code; 

    public People(int person_id, string last_name, string first_name, string street_addr, string state_code, string postal_code) 
    { 
     this.person_id = person_id; 
     this.last_name = last_name; 
     this.street_addr = street_addr; 
     this.state_code = state_code; 
     this.postal_code = postal_code; 
    } 

    public People() { } 
} 

WCFサービス:

public class Service1 : IService1 
{ 
/// <summary> 
/// Call stored proc and return resultset. 
/// </summary> 
/// <returns>List of resultset as concrete class People.</returns> 
public List<People> usp_GetPeople() 
{ 
    try 
    { 
     using (var db = new demoEntities()) 
     { 
      var res = db.usp_GetPeople(); 

      List<People> lst = new List<People>(); 

      foreach (usp_GetPeople_Result r in res) 
      { 
       People p = new People(r.person_id, r.last_name, r.first_name, r.street_addr, r.state_code, r.postal_code); 
       lst.Add(p); 
      } 

      return lst; 
     } 
    } 
    catch (Exception e) 
    { 
     Utility.Log("Error in usp_GetPeople. " + e.ToString()); 
     return null; 
    } 
} 
+1

どのようなエラーを取得していますか? –

+0

オブジェクト(People)がデータ属性で装飾されていないことがありますか? (DataContract/DataMember)http://msdn.microsoft.com/en-us/library/ms733127.aspx – Mike

+0

'System.Collections.Generic.List '型を暗黙的に 'System.Data.Objects'に変換できません.ObjectResult '\t 私は戻って再試行しました。基本的には、ObjectResult の代わりにリストを返す必要があるようです。それはそのように機能します。 – Superdog

答えて

1

回答のリストを返すことですEF複合型。

public List<usp_GetPeople_Result> usp_GetPeople2() 
    { 
     using (var db = new demoEntities()) 
     { 
      return db.usp_GetPeople().ToList(); 
     } 
    } 

これは動作しません:あなたはEFによって作成されたタイプを返すようにしようとしているとき、あなたは

public ObjectResult<usp_GetPeople_Result> usp_GetPeople3() 
    { 
     using (var db = new demoEntities()) 
     { 
      return db.usp_GetPeople(); 
     } 
    } 
関連する問題