带有包含Xml的View的实体框架的WCF数据服务

时间:2015-10-20 10:27:26

标签: c# wcf entity-framework-5 odata wcf-data-services

我们有一个SQL服务器视图,其中包含一些XML字段。 我们首先使用Entity Framework(v5)数据库创建了一个DBContext。 我们添加了一个WCF数据服务并将其分配给DBContext,如:

       public class ProductsDBSvc : DataService<ProductsDBEntities>
       {
         config.UseVerboseErrors = true;

         config.SetEntitySetPageSize("vw_Release", 100);
         config.SetEntitySetAccessRule("vw_Release", EntitySetRights.AllRead);
       }

使用浏览器我们拨打此电话http://localhost:60606/Products/vw_Release,但会返回以下错误:

<m:internalexception>
<m:message>
The XML data type cannot be compared or sorted, except when using the IS NULL operator.
</m:message>
<m:type>System.Data.SqlClient.SqlException</m:type>
<m:stacktrace>
 at System.Data.SqlClient.SqlConnection.OnError(SqlException exception,         Boolean breakConnection, Action`1 wrapCloseInAction)
 at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
 at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
 at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
 at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
 at System.Data.SqlClient.SqlDataReader.get_MetaData()
 at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,     RunBehavior runBehavior, String resetOptionsString)
 at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
 at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
 at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
 at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
 at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
</m:stacktrace>
</m:internalexception>

错误意味着我们不能在order by子句中使用XML列,这是SQL Server错误。 虽然我们从未在查询中要求订单。

所以我们激活了SQL Profiler,我们发现了以下信息: 1- OData WCF服务与实体框架引用视图(而不是表)发送一个SQL语句,其中包括每个列的order by,如下所示:

  SELECT 
  [vw_Release].[ID] AS [ID], 
  [vw_Release].[TypeNameXml] AS [TypeNameXml], 
  [vw_Release].[StatusNameXml] AS [StatusNameXml], 
  [vw_Release].[Created] AS [Created], 
  [vw_Release].[Modified] AS [Modified], 
  FROM [dbo].[vw_Release] AS [vw_Release]) AS [Extent1]
  )  AS [Project1]
  ORDER BY [Project1].[Created] ASC, 
  [Project1].[ID] ASC, [Project1].[Modified] ASC,
  [Project1].[StatusNameXml] ASC, [Project1].[TypeNameXml] ASC

2-获取相同的信息但只是从表而不是视图中读取发送:

  SELECT 
  [Release].[ID] AS [ID], 
  [Release].[TypeNameXml] AS [TypeNameXml], 
  [Release].[StatusNameXml] AS [StatusNameXml], 
  [Release].[Created] AS [Created], 
  [Release].[Modified] AS [Modified], 
  FROM [dbo].[Release] AS [vw_Release]) AS [Extent1]
  ORDER BY [Project1].[Created] ASC, 
  [Extent1].[ID] ASC

我们所做的一切都是开箱即用的功能,并且可以轻松复制。有没有办法告诉WCF数据服务不要为所有列包含order by?

1 个答案:

答案 0 :(得分:0)

我认为这个问题与Config.SetEntityPage大小有关,你可以尝试不设置它,看看会发生什么。

Problem with WCF Data Service (OData), SetEntitySetPageSize and custom operations