0

サンプルnugetに含まれるbreezeサンプルアプリケーションと非常によく似たセットアップを行いました。これは私の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-内部サーバーエラーが発生し、これが応答のペイロードです。

{"$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] public IEnumerable WorkOrders(){return _contextProvider.Context.WorkOrders.AsEnumerable(); }

ただし、これにより、この質問で説明されているように、クライアント側で別の問題が発生します。

4

1 に答える 1

1

ここでは推測ですが、次の属性で最新のそよ風(v 0.82.1)を使用してみてください。

[BreezeController]

これらの代わりに

[JsonFormatter、ODataActionFilter]

新しい[BreezeController]属性は、他の2つを完全に置き換えるものであり、他のいくつかの問題を回避します。

于 2013-01-04T19:32:17.330 に答える