2012-10-21 7 views
5

Chcę utworzyć usługę WCF, która wywołuje procedurę przechowywaną w SQL Server przy użyciu Entity Framework i zwraca zestaw wyników do przeglądarki.Lepszy sposób wywoływania procedury przechowywanej przy użyciu Entity Framework i powrotu z WCF?

Zaimportowałem procedurę przechowywaną za pomocą funkcji importowania w EF i zbudowałem typ złożony.

Wygląda na to, że typ złożony z EF nie może być serializowany i zwracany w sposób spokojny. Jedynym sposobem, w jaki to zrobiłem, jest stworzenie konkretnej klasy i zbudowanie jej ze złożonego typu zwróconego z EF. Działa to, ale oznacza to, że jeśli mam 30 procedur przechowywanych, musiałbym utworzyć 30 konkretnych klas, co jest nieco uciążliwe.

Czy jest lepszy sposób to zrobić? Umowa

WCF:

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

klasa betonu musiałyby być tworzone dla każdej procedury:

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

usługa 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

Co ty się błąd, gdy próbuje powrócić typ stworzony przez EF? –

+0

Czy to możliwe, że twój obiekt (Ludzie) nie jest ozdobiony atrybutami danych? (DataContract/DataMember) http://msdn.microsoft.com/en-us/library/ms733127.aspx – Mike

+0

Nie można niejawnie przekonwertować typu "System.Collections.Generic.List 'na' System.Data.Objects .ObjectResult '\t Wróciłem i spróbowałem ponownie. Zasadniczo wygląda na to, że po prostu muszę zwrócić listę zamiast ObjectResult . Działa w ten sposób. – Superdog

Odpowiedz

1

Odpowiedź jest powrót listę Typ złożony EF.

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

To nie zadziała:

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