Ошибка ObjectQuery при использовании STE и WCF - PullRequest
0 голосов
/ 29 ноября 2011

Я получил эту ошибку, когда внедряю STE в EF4 и WCF

"Не удалось найти сопоставление объектов для типа с идентификатором 'NorthwindModel.Customer'."

если я не использую STE (в одном проекте), этот код работает.

Пошаговое руководство. Сериализация самопроверкаемых объектов

Вот мой код

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 Config

<?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 голосов
/ 29 ноября 2011

Это не будет работать над WCF. Вы всегда должны отправлять реальный тип сущности обратно, а не DbDataRecord, который является абстрактным классом. WCF должен знать, какой реальный тип используется. Реальный тип в EF, вероятно, MaterializedDbRecord, который является внутренним и не сериализуемым.

При представлении методов через WCF вы должны использовать простые типы или контракты данных / serializalbe типы в качестве параметров и результатов. STE - это контракты на данные, поэтому используйте их напрямую - это, очевидно, нарушает ваше требование отправлять нетипизированные запросы от клиента, но это не сценарий для WCF.

Если вы ищете технологию, которая позволит вам создавать запросы на клиенте, проверьте Службы данных WCF (но они не поддерживают STE).

...