0

我在我的 SPA 中使用 Breeze 取得了很大的成功,但在尝试使用 expand() 在单个查询中返回父->子数据时似乎卡住了。

在进行单表查询时,JSON 返回中的 $type 是正确的:

$type: MySPA.Models.Challenge, MySPA 没有展开

但是,如果我在查询中使用 expand(),我会得到关系数据,但 $type 是这样的:

System.Collections.Generic.Dictionary 2[[System.String, mscorlib],[System.Object, mscorlib]]

展开

由于 $type 不是正确的表 + 命名空间,客户端代码无法判断这是一个实体并将其公开为 JSON 而不是 Breeze 对象(带有 observables、entityAspect 等)。

起初我使用自己的 ContextProvider 以便我可以覆盖之前/之后的保存方法。当我遇到这些问题时,我又回到了常用的 EFContextProvider<>。

我在数据库优先模式下使用 EF5。

这是我的控制器代码:

[BreezeController]
public class DataController : ApiController
{
    // readonly ModelProvider _contextProvider = new ModelProvider();
    readonly EFContextProvider<TestEntities> _contextProvider = new EFContextProvider<TestEntities>();

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    [HttpGet]
    public IQueryable<Challenge> Challenges()
    {
        return _contextProvider.Context.Challenges; 
    }

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }       
    public IQueryable<ChallengeNote> ChallengeNotes()
    {       
        return _contextProvider.Context.ChallengeNotes;
    }
}

这是我的 BreezeWebApiConfig.cs

 public static void RegisterBreezePreStart()
  {
      GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

      GlobalConfiguration.Configuration.Routes.MapHttpRoute(
          name: "BreezeApi",
          routeTemplate: "breeze/{controller}/{action}"
      );
  }

是否有我缺少的配置设置?

4

2 回答 2

1

您是否尝试在服务器端“扩展”?是否需要在客户端进行扩展?我之前尝试过扩展,但对我来说也失败了,做了一些研究并决定我宁愿把它放在服务器上:

[HttpGet]
public IQueryable<Challenge> ChallengesWithNotes()
    {
        return _contextProvider.Context.Challenges.Include("ChallengeNotes"); 
    }

这应该按预期进行解析。在客户端,您将查询“ChallengeNotes”而不是“Challenges”,并且您不需要编写展开部分。

于 2013-11-12T15:23:33.700 回答
0

我强烈怀疑问题是由于您使用了该[Queryable]属性。

您必须改用该[BreezeQueryable]属性!

请参阅有关限制查询的文档

我们知道 Web API在 Web API v.1.5 中QueryableAttribute已被弃用。EnableQueryAttribute请坚持下去,BreezeQueryable直到我们有机会为EnableQuery. 查看文档以了解此开发的状态。

于 2014-10-07T19:54:51.713 回答