Utilizando WCF Data Services (y el último Entity Framework), deseo devolver datos de un procedimiento almacenado. Los campos sproc devueltos no coinciden 1: 1 cualquier entidad en mi db, por lo que crean un nuevo tipo de complejo para que en el modelo edmx (en lugar de adjuntar una entidad existente):¿Cómo consumir un objeto complejo desde un sproc utilizando WCF Data Services/OData?
- Haga clic con el *. modelo edmx/Añadir/función de importación
- Seleccione la sproc (devuelve tres campos) - GetData
- clic en Obtener información columna
- Agregue el Nombre de la función de importación: GetData
- Haga clic en Crear nuevo tipo de complejo - GetData_Result
En el servicio, que definen:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
he creado una aplicación de consola rápida para poner a prueba, y ha añadido una referencia a System.Data.Services
y System.Data.Services.Client
- esto después de ejecutar Install-Package EntityFramework -Pre
, pero las versiones en las bibliotecas son 4.0 y no se 5.x.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Services.Client;
using ConsoleApplication1.PrimaryDBService;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/PrimaryDataService1.svc/"));
IEnumerable<GetData_Result> result = context.Execute<GetData_Result>(new Uri("http://localhost:50100/PrimaryDataService1.svc/GetDataSproc"));
foreach (GetData_Result w in result)
{
Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME + "\t" + w.CREATED_DATE);
}
Console.Read();
}
}
}
no hizo uso de la UriKind.Relative
o cualquier otra cosa para complicar esto.
Cuando navego en el navegador hacia la URL, veo datos, pero cuando los consumo en la aplicación de mi consola, no obtengo nada.
Adición de rastreo a la mezcla:
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\WebWCFDataService.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
... y la apertura mediante el seguimiento de servicio Visor de Microsoft, veo dos advertencias: Idential
contexto de evaluación de configuración no se ha encontrado.
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>524312</EventID>
<Type>3</Type>
<SubType Name="Warning">0</SubType>
<Level>4</Level>
<TimeCreated SystemTime="2012-04-03T14:50:11.8355955Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{66f1a241-2613-43dd-be0c-341149e37d30}" />
<Execution ProcessName="WebDev.WebServer40" ProcessID="5176" ThreadID="10" />
<Channel />
<Computer>MyComputer</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.EvaluationContextNotFound.aspx</TraceIdentifier>
<Description>Configuration evaluation context not found.</Description>
<AppDomain>fd28c9cc-1-129779382115645955</AppDomain>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
Así que ¿por qué estoy capaz de ver los datos desde el navegador, pero no cuando se consume en mi aplicación?
- ACTUALIZACIÓN -
he descargado el Microsoft WCF Data Services October 2011 CTP que expuso DataServiceProtocolVersion.V3
, creó un nuevo servidor y el cliente y se hace referencia Microsoft.Data.Services.Client (v4.99.2.0). Ahora conseguir el siguiente error en el cliente cuando se trata iterate en el bucle foreach
:
Hay una coincidencia de tipos entre el cliente y el servicio. Tipo 'ConsoleApplication1.WcfDataServiceOctCTP1.GetDataSproc_Result' es un tipo de entidad , pero el tipo en la carga útil de respuesta no representa un tipo de entidad. Asegúrese de que los tipos definidos en el cliente coincidan con el modelo de datos del servicio o actualice la referencia del servicio en el cliente .
Probé lo mismo al hacer referencia a la entidad real - funciona bien, por lo que el mismo problema.