2012-10-21 1 views
5

Desidero creare un servizio WCF che richiami una stored procedure in SQL Server utilizzando Entity Framework e restituisca il set di risultati a un browser.Un modo migliore per chiamare una stored procedure utilizzando Entity Framework e restituire restfully da WCF?

Ho importato la procedura memorizzata utilizzando la funzione di importazione in EF e ho creato un tipo complesso.

Sembra che un tipo complesso dall'EF non possa essere serializzato e restituito in modo riposante. L'unico modo in cui ho fatto questo lavoro è quello di creare una classe concreta e crearla dal tipo complesso restituito da EF. Funziona ma significa che se avessi 30 stored procedure avrei bisogno di creare 30 lezioni concrete che sono un po 'dolorose.

C'è un modo migliore per farlo? contratto

WCF:

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

classe concreta avrebbe bisogno di essere creato per ogni procedura:

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() { } 
} 

servizio 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

Quale errore state ottenendo quando si sta cercando di restituire il tipo creato da EF? –

+0

Potrebbe essere che il tuo oggetto (Persone) non sia decorato con gli attributi dei dati? (DataContract/DataMember) http://msdn.microsoft.com/en-us/library/ms733127.aspx – Mike

+0

Impossibile convertire implicitamente il tipo 'System.Collections.Generic.List ' a 'System.Data.Objects .ObjectResult '\t Sono tornato indietro e ho provato di nuovo. Fondamentalmente sembra che ho solo bisogno di restituire una lista invece di ObjectResult . Funziona in questo modo. – Superdog

risposta

1

risposta è per restituire un elenco di Tipo di complesso EF

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

Questo non funziona:

public ObjectResult<usp_GetPeople_Result> usp_GetPeople3() 
    { 
     using (var db = new demoEntities()) 
     { 
      return db.usp_GetPeople(); 
     } 
    }