使用WCF數據服務(和最新的實體框架),我想從存儲過程返回數據。返回的sproc字段與1:1的數據庫不匹配,因此我在edmx模型中創建了一個新的複雜類型(而不是附加現有實體):如何使用WCF Data Services/OData從sproc中消耗複雜對象?
- 右鍵單擊*。 EDMX模型/添加/函數導入
- 選擇存儲過程(返回三個字段) - 的GetData
- 單擊獲取列信息
- 添加函數導入名稱:的GetData
- 單擊創建新的複雜類型 - GetData_Result
在服務上,我定義:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
我創建了一個快速的控制檯應用程序進行測試,並增加了一個參考System.Data.Services
和System.Data.Services.Client
- 運行Install-Package EntityFramework -Pre
在此之後,但在庫的版本是4.0,而不是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();
}
}
}
我沒有使用UriKind.Relative
或其他任何東西來使這個複雜化。
當我在瀏覽器中導航到URL時,我看到了數據,但是當我在控制檯應用程序中使用它時,我一無所獲。
添加跟蹤進來:
<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>
...並使用Microsoft服務跟蹤查看器打開,我看到兩個idential警告:
配置評價方面沒有發現。
<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>
那麼,爲什麼我能夠從瀏覽器中看到的數據,而不是在我的應用程序消耗?
- 更新 -
我下載裏面露出DataServiceProtocolVersion.V3
的Microsoft WCF Data Services October 2011 CTP,創造了一個新的主機和客戶端和參考Microsoft.Data.Services.Client(v4.99.2.0)。
還有就是客戶端和服務之間的類型不匹配:現在在
foreach
循環迭代試圖獲取時,在客戶端上下面的錯誤。類型 'ConsoleApplication1.WcfDataServiceOctCTP1.GetDataSproc_Result'是一個 實體類型,但響應有效內容中的類型不代表 實體類型。請確保在客戶端上定義的類型匹配 服務的數據模型,或者更新 客戶端上的服務參考。
我通過引用實際的實體嘗試相同的事情 - 工作正常,所以同樣的問題。