Utilizzando WCF Data Services (e l'ultimo Entity Framework), voglio restituire i dati da una stored procedure. I campi sProc restituiti non corrispondono 1: 1 qualsiasi entità nel mio db, quindi creare un nuovo tipo complesso per esso nel modello edmx (piuttosto che attaccare un'entità esistente):Come consumare un oggetto complesso da una sproc usando WCF Data Services/OData?
- Fare clic con il *. modello edmx/Aggiungi/funzione di importazione
- Selezionare lo sproc (restituisce tre campi) - GetData
- fare clic su Informazioni Colonna
- Aggiungere la funzione di importazione Nome: GetData
- Fare clic su Crea nuovo tipo complesso - GetData_Result
Nel servizio, definisco:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
ho creato una console app rapido per testare, e ha aggiunto un riferimento a System.Data.Services
e System.Data.Services.Client
- questo dopo l'esecuzione Install-Package EntityFramework -Pre
, ma le versioni su librerie sono 4.0 e non 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();
}
}
}
non ho usato la UriKind.Relative
o qualsiasi altra cosa a complicare questo.
Quando navigo nel browser verso l'URL, vedo i dati, ma quando li consumo nella mia app per console, non ottengo nulla.
Aggiunta di tracciamento al mix:
<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>
... e l'apertura utilizzando il Servizio Trace Viewer Microsoft, vedo due avvertimenti idential:
configurazione contesto di valutazione non è stato trovato.
<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>
Allora perché sono in grado di vedere i dati dal browser, ma non se consumato nella mia app?
- AGGIORNAMENTO -
ho scaricato il Microsoft WCF Data Services October 2011 CTP che ha svelato DataServiceProtocolVersion.V3
, ha creato un nuovo host e client e si fa riferimento Microsoft.Data.Services.Client (v4.99.2.0). Ora ottenere il seguente errore sul client quando si cerca iterate nel ciclo foreach
:
V'è un tipo non corrispondente tra il client e il servizio. Digitare 'ConsoleApplication1.WcfDataServiceOctCTP1.GetDataSproc_Result' è un tipo di entità , ma il tipo nel payload di risposta non rappresenta un tipo di entità. Assicurarsi che i tipi definiti sul client corrispondano a il modello di dati del servizio o aggiornare il riferimento del servizio sul client .
Ho provato la stessa cosa facendo riferimento all'entità reale - funziona bene, quindi lo stesso problema.