Breeze EFContextProvider返回与标准DbContext不同的数据

时间:2013-04-02 21:03:52

标签: breeze

我有一个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控制器响应显示正确的对象值。

思想?

2 个答案:

答案 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被循环引用绊倒了,返回的数据只是......好吧......奇怪而错误。