使用STE和WCF时出现ObjectQuery错误

时间:2011-11-29 03:45:45

标签: vb.net wcf entity-framework-4 self-tracking-entities objectquery

我在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=&quot;data source=(local);initial catalog=Northwind;persist security info=True;user id=sa;password=145837;multipleactiveresultsets=True;App=EntityFramework&quot;" 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

希望有人能指导我。如果您需要,也可以获得以上样本的完整来源

1 个答案:

答案 0 :(得分:0)

这不适用于WCF。您必须始终返回真实实体类型,而不是抽象类DbDataRecord。 WCF必须知道使用的实际类型。 EF中的实际类型可能是MaterializedDbRecord,它是内部的,不可序列化的。

通过WCF公开方法时,必须使用简单类型或数据协定/ serializalbe类型作为参数和结果。 STE是数据合同,因此直接使用它们 - 这显然会破坏您从客户端发送无类型查询的要求,但它不适用于WCF。

如果您正在寻找可以在客户端创建查询的技术,请检查WCF Data Services(但他们不支持STE)。