【发布时间】:2012-04-03 15:52:24
【问题描述】:
使用 WCF 数据服务(和最新的实体框架),我想从存储过程返回数据。返回的 sproc 字段与我的数据库中的任何实体都不匹配 1:1,因此我在 edmx 模型中为其创建了一个新的复杂类型(而不是附加现有实体):
- 右键单击 *.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 服务跟踪查看器打开,我看到两个相同的警告:
未找到配置评估上下文。
<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' 是一个 实体类型,但响应载荷中的类型不代表 实体类型。请确保客户端上定义的类型匹配 服务的数据模型,或更新服务引用 客户。
我通过引用实际实体尝试了同样的事情 - 工作正常,所以同样的问题。
【问题讨论】:
标签: entity-framework c#-4.0 wcf-data-services