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;
}
}
Co ty się błąd, gdy próbuje powrócić typ stworzony przez EF? –
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
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