我在EF4和WCF中实现STE时收到此错误
"找不到具有标识的类型' NorthwindModel.Customer'。"
如果我没有使用STE(在单个项目中),则此代码正常运行。
Walkthrough: Serialize Self-Tracking Entities
这是我的代码
WCF:
Public Class Service1
Implements IService1
Public Function GetData(ByVal query As String) As List(Of DbDataRecord) Implements IService1.GetData
Try
Using ctx = New NorthwindEntities()
Return New ObjectQuery(Of DbDataRecord)(query, ctx).ToList 'Here is the error.
End Using
Catch ex As Exception
Dim theFault As New ServFault()
theFault.Reason = ex.Message.ToString()
Throw New FaultException(Of ServFault)(theFault, ex.Message.ToString)
End Try
End Function
Public Function GetOrderByCustomer(customerId As String) As System.Collections.Generic.List(Of Entities.Order) Implements IService1.GetOrderByCustomer
Try
Using ctx = New NorthwindEntities()
Return (From ord In ctx.Orders Where ord.CustomerID = customerId).ToList
End Using
Catch ex As Exception
Dim theFault As New ServFault()
theFault.Reason = ex.Message.ToString()
Throw New FaultException(Of ServFault)(theFault, ex.Message.ToString)
End Try
End Function
End Class
WCF配置
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<connectionStrings>
<add name="NorthwindEntities" connectionString="metadata=res://*/NWDModel.csdl|res://*/NWDModel.ssdl|res://*/NWDModel.msl;provider=System.Data.SqlClient;provider connection string="data source=(local);initial catalog=Northwind;persist security info=True;user id=sa;password=145837;multipleactiveresultsets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
</connectionStrings>
</configuration>
WCF客户端:
Module Module1
Sub Main()
Dim srv As New Service1Client
Dim query As String
Dim lst As List(Of DbDataRecord)
Console.WriteLine("Start...")
Dim orders As List(Of Entities.Order)
orders = srv.GetOrderByCustomer("ALFKI") 'This code is working
Console.WriteLine("Success!!! Order Count: {0}", orders.Count)
query = "SELECT p FROM Customers AS p"
lst = srv.GetData(query)
Console.WriteLine("Total Customer: {0}", lst.Count)
srv.Close()
Console.ReadLine()
End Sub
End Module
希望有人能指导我。如果您需要,也可以获得以上样本的完整来源
答案 0 :(得分:0)
这不适用于WCF。您必须始终返回真实实体类型,而不是抽象类DbDataRecord
。 WCF必须知道使用的实际类型。 EF中的实际类型可能是MaterializedDbRecord
,它是内部的,不可序列化的。
通过WCF公开方法时,必须使用简单类型或数据协定/ serializalbe类型作为参数和结果。 STE是数据合同,因此直接使用它们 - 这显然会破坏您从客户端发送无类型查询的要求,但它不适用于WCF。
如果您正在寻找可以在客户端创建查询的技术,请检查WCF Data Services(但他们不支持STE)。