使用$ expand与NHibernate和webapi + OData时出错

时间:2013-12-14 11:36:47

标签: nhibernate asp.net-web-api fluent-nhibernate odata asp.net-mvc-5

运行查询{{odata-url-prefix}}/ArquivosVenda(2)?$expand=Vendas时会生成错误:

{
    "odata.error": {
        "code": "",
        "message": {
            "lang": "en-US",
            "value": "An error has occurred."
        },
        "innererror": {
            "message": "Argument types do not match",
            "type": "System.ArgumentException",
            "stacktrace": "   at System.Web.Http.ApiController.<InvokeActionWithExceptionFilters>d__1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"
        }
    }
}

我注意到使用$expand时发生错误; {{odata-url-prefix}}/ArquivosVenda(2){{odata-url-prefix}}/ArquivosVenda(2)/Vendas的查询通常会运行,只有$expand的查询才会出现此问题。

代码

public class ArquivoVenda: IAuditavel, IEntidade
{
    public virtual int Id { get; set; }
    public virtual string FileName { get; set; }
    public virtual ICollection<Venda> Vendas { get; set; }
}


public class Venda : IAuditavel, IEntidade
{
    public virtual int Id { get; set; }

    public virtual DateTime Data { get; set; }
    public virtual string GSM { get; set; }
    public virtual string Plano { get; set; }
}

控制器

[Authorize]
public abstract class BaseEntidadeController<TEntidade> : ODataController
    where TEntidade : class, IEntidade
{
    protected IRepositorio<TEntidade> Repositorio { get; private set; }

    public BaseEntidadeController(IRepositorio<TEntidade> repositorio)
    {
        Repositorio = repositorio;
    }

    [HttpGet, Queryable(AllowedQueryOptions = AllowedQueryOptions.All, PageSize = 25, MaxExpansionDepth = 3)]
    public IQueryable<TEntidade> Get()
    {
        return Repositorio.All();
    }

    [Queryable(MaxExpansionDepth = 3)]
    public virtual SingleResult<TEntidade> Get([FromODataUri]int key)
    {
        return SingleResult.Create<TEntidade>(Repositorio.Query(c => c.Id == key));
    }

    [HttpGet]
    protected virtual TEntidade GetEntityByKey(int key)
    {
        return Repositorio.All().FirstOrDefault(p => p.Id == key);
    }
}

public class ArquivosVendaController  : BaseEntidadeController<ArquivoVenda>
{
    public ArquivosVendaController(IArquivosVendaRepositorio repositorio)
        : base(repositorio)
    { }

    public IQueryable<Venda> GetVendas([FromODataUri] int key)
    {
        return Repositorio.Get(key).Vendas.AsQueryable();
    }
}

WebApi配置

...
var arquivoVenda = modelBuilder.EntitySet<ArquivoVenda>("ArquivosVenda");
arquivoVenda.EntityType.HasKey(p => p.Id);

var venda = modelBuilder.EntitySet<Venda>("Vendas");
venda.EntityType.HasKey(p => p.Id);
...

0 个答案:

没有答案