带有包含Xml的实体框架和视图的WCF数据服务
本文关键字:视图 WCF 数据 服务 实体 包含 Xml 框架 | 更新日期: 2023-09-27 18:18:24
我们有一个包含一些XML字段的SQL server视图。我们首先使用实体框架(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错误。而我们从来没有在查询中要求order by。
所以我们激活SQL分析器,我们发现以下信息:使用实体框架的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数据服务不包括所有列的排序?
我认为这个问题与配置有关。SetEntityPage size,你能试着不设置它看看会发生什么吗
WCF数据服务(OData), settentitysetpagesize和自定义操作的问题