【问题标题】:Breeze webapi controller 'cannot support querying' over DbSet errorBreeze webapi 控制器“无法支持查询”超过 DbSet 错误
【发布时间】:2012-12-19 04:32:11
【问题描述】:

我的设置与 sample nuget 中的微风示例应用程序非常相似。这是我的 api 控制器的代码:

[JsonFormatter, ODataActionFilter]
public class WorkOrdersController : ApiController
{
    readonly EFContextProvider<WorkOrdersContext> _contextProvider =
        new EFContextProvider<WorkOrdersContext>();

    public WorkOrdersController()
    {
        // I was thinking this may be the cause of the issue
        this._contextProvider.Context.Configuration.ProxyCreationEnabled = false;
    }

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }

    [HttpGet]
    public IQueryable<WorkOrder> WorkOrders()
    {
        return _contextProvider.Context.WorkOrders;
    }

}

我遇到的问题是,当我尝试对 WorkOrders 操作执行查询时,我得到 500 - Internal server error,这是响应的负载:

{"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred.","ExceptionMessage":"The action 'WorkOrders' on controller 'WorkOrders' with return type 'System.Collections.Generic.List`1[[WorkOrders.Domain.Models.WorkOrder, WorkOrders.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' cannot support querying. Ensure the type of the returned content is IEnumerable, IQueryable, or a generic form of either interface.","ExceptionType":"System.InvalidOperationException","StackTrace":"   at System.Web.Http.QueryableAttribute.ValidateReturnType(Type responseContentType, HttpActionDescriptor actionDescriptor)\r\n   at System.Web.Http.QueryableAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n   at System.Web.Http.Tracing.ITraceWriterExtensions.TraceBeginEnd(ITraceWriter traceWriter, HttpRequestMessage request, String category, TraceLevel level, String operatorName, String operationName, Action`1 beginTrace, Action execute, Action`1 endTrace, Action`1 errorTrace)\r\n   at System.Web.Http.Tracing.Tracers.ActionFilterAttributeTracer.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass2.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__0(HttpResponseMessage response)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass41`2.<Then>b__40(Task`1 t)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken, Boolean runSynchronously)"}

WorkOrders 是上下文中的 Dbset:

public DbSet<WorkOrder> WorkOrders { get; set; }

我也尝试过将其显式转换为 IQueryable,但没有任何变化:

[HttpGet]
public IQueryable<WorkOrder> WorkOrders()
{
    return (IQueryable<WorkOrder>)_contextProvider.Context.WorkOrders;
}

唯一对我有用的是:

[HttpGet] 公共 IEnumerable WorkOrders() { 返回 _contextProvider.Context.WorkOrders.AsEnumerable(); }

然而,这在客户端给我带来了另一个问题,如this 问题中所述。

【问题讨论】:

  • ProxyCreationEnabled = false 应该不是问题。我相信EFContextProvider 设置了该配置本身。

标签: asp.net-web-api entity-framework-5 breeze


【解决方案1】:

这里只是一个猜测,但您可以尝试使用具有以下属性的最新微风(v 0.82.1)。

[微风控制器]

而不是这些

[JsonFormatter, ODataActionFilter]

新的 [BreezeController] 属性完全替代了其他两个属性并避免了其他一些问题。

【讨论】:

  • 是的。我敢打赌,您正在使用 App_Data\WebApiConfig.cs 中带有 config.EnableQuerySupport(); 的新 MVC 模板之一。此行添加了一个与 Breeze ODataActionFilter 竞争的过滤器。 BreezeController 属性删除了冲突的过滤器。
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2018-10-23
  • 2015-09-08
相关资源
最近更新 更多