我有一个breeze控制器,它返回的是不同于常规ole APIController的JSON。
我的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控制器响应显示正确的对象值。
思想?
丹
答案 0 :(得分:0)
ApiController上的[BreezeController]属性会更改默认的JSON.net序列化设置,以便breeze可以序列化实体图形,而无需多次重复相同的实体。默认的序列化程序不会这样做。如果将[BreezeController]属性应用于api控制器,您应该会看到'$ ref'值出现。
答案 1 :(得分: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被循环引用绊倒了,返回的数据只是......好吧......奇怪而错误。