0

我有一个微风控制器,它返回的 JSON 与常规的 ole APIController 不同。

我的 Breeze.js 控制器有一个如下所示的方法:

[HttpGet]
public IQueryable<Application> Applications()
{
var admin = _contextProvider.Context.Administrators.Include(i => i.Applications).Single(o => o.Name == User.Identity.Name);
    return admin.Applications.AsQueryable();
}

我有一个传统的 ApplicationsController: ApiController 有这样的方法:

    public IEnumerable<Application> Get()
    {
        var admin = myDbContext.Administrators.Include(i => i.Applications).Single(o => o.Name == User.Identity.Name);
        return admin.Applications.AsQueryable();
    }

基本上,代码是相同的。但是,响应正文值不是。Breeze 响应正文包含 {$ref: "3"},{$ref: "4"} 而传统的 WebAPI 控制器响应显示正确的对象值。

想法?

4

2 回答 2

0

我能够通过将 LINQ 重写为以下内容来解决我的问题:

        return from u in context.Administrators
               where u.Name == administratorName
               from d in u.Applications
               select d;

我重新阅读了 Breeze 提供的文档,他们强调不返回循环引用。对于那些阅读本文的人,请确保您的 DbContext 在其构造函数中具有以下内容。

        Configuration.ProxyCreationEnabled = false;
        Configuration.LazyLoadingEnabled = false;

我还删除了所有“虚拟”导航属性。

我原来的 LINQ 有一个 Include 语句,它会返回循环引用。在使用 BreezeController 之前,标准的 APIController 将数据准确地返回给客户端,只是重复的数据。一个 BreezeController 被循环引用绊倒了,返回的数据只是......好吧......奇怪和错误。

于 2013-04-03T17:01:57.203 回答
0

ApiController 上的 [BreezeController] 属性更改了默认的 JSON.net 序列化设置,以便微风可以序列化实体图,而无需多次重复同一实体。默认序列化程序不这样做。如果您将 [BreezeController] 属性应用于您的 api 控制器,您应该会看到“$ref”值出现。

于 2013-04-02T22:06:24.227 回答